手动创建pyspark数据帧

手动创建pyspark数据帧,pyspark,pyspark-dataframes,Pyspark,Pyspark Dataframes,我试图在给定某些数据的情况下手动创建pyspark数据帧: row_in=[(1566429545575348),(40.353977),(-111.701859)] rdd=sc.parallelize(row_in) schema = StructType([StructField("time_epocs", DecimalType(), True),StructField("lat", DecimalType(),True),StructFie

我试图在给定某些数据的情况下手动创建pyspark数据帧:

row_in=[(1566429545575348),(40.353977),(-111.701859)]
rdd=sc.parallelize(row_in)
schema = StructType([StructField("time_epocs", DecimalType(),    True),StructField("lat", DecimalType(),True),StructField("long", DecimalType(),True)])
df_in_test=spark.createDataFrame(rdd,schema)
当我试图显示数据帧时,会出现一个错误,因此我不确定如何执行此操作

然而,Spark文档对我来说似乎有点复杂,当我试图遵循这些说明时,我也遇到了类似的错误


有人知道怎么做吗?

简单的数据帧创建:

df=spark.createDataFrame(
[
(1,“foo”),#在此处创建数据,保持类型一致。
(2,“律师公会”),
],
[“id”,“label”]#在此处添加您的列名
)
df.printSchema()
根
|--id:long(nullable=true)
|--标签:字符串(nullable=true)
df.show()
+---+-----+                                                                     
|id |标签|
+---+-----+
|1|foo|
|2 |巴|
+---+-----+
根据:

  • 当schema是列名列表时,每个列的类型都将从数据中推断出来
  • 当模式为
    pyspark.sql.types.DataType
    或数据类型字符串时,它必须与实际数据匹配
#数据类型字符串示例
df=spark.createDataFrame(
[
(1,“foo”),#在此处添加您的数据
(2,“律师公会”),
],  
“id int,label string”#在此处添加列名和类型
)
#pyspark.sql.types示例
从pyspark.sql导入类型为T
df=spark.createDataFrame(
[
(1,“foo”),#在此处添加您的数据
(2,“律师公会”),
],
T.StructType(#在StructType中定义整个架构
[
T.StructField(“id”,T.IntegerType(),True),
T.StructField(“标签”,T.StringType(),True),
]
),
)
df.printSchema()
根
|--id:integer(nullable=true)#id的类型强制为Int
|--标签:字符串(nullable=true)

以@Steven的答案为基础进行详细阐述:

字段=[
StructField(“乘数”,FloatType(),True),
StructField(“说明”,StringType(),True),
]
schema=StructType(字段)
乘数_df=sqlContext.createDataFrame(sc.emptyRDD(),模式)
将创建一个空白数据框

现在,我们只需添加一行即可:

l=[(2.3,“这是一个示例描述”)]
rdd=sc.并行化(l)
乘数_df_temp=spark.createDataFrame(rdd,模式)
倍增器df=wtp\U倍增器df.union(wtp\U倍增器df\U temp)

扩展@Steven的答案:

data = [(i, 'foo') for i in range(1000)] # random data

columns = ['id', 'txt']    # add your columns label here

df = spark.createDataFrame(data, columns)
注意:
schema
是列名列表时,将根据数据推断每列的类型

如果要专门定义架构,请执行以下操作:

from pyspark.sql.types import StructType, StructField, IntegerType, StringType
schema = StructType([StructField("id", IntegerType(), True), StructField("txt", StringType(), True)])
df1 = spark.createDataFrame(data, schema)
产出:

>>> df1
DataFrame[id: int, txt: string]
>>> df
DataFrame[id: bigint, txt: string]

对于初学者,下面是从文件导入数据的完整示例:

从pyspark.sql导入SparkSession
从pyspark.sql.types导入(
短型,
StringType,
结构类型,
StructField,
时间戳类型,
)
导入操作系统
here=os.path.abspath(os.path.dirname(_文件__))
spark=SparkSession.builder.getOrCreate()
schema=StructType(
[
StructField(“id”,ShortType(),null=False),
StructField(“string”,StringType(),nullable=False),
StructField(“datetime”,TimestampType(),null=False),
]
)
#手动读取文件或构造行
df=spark.read.csv(os.path.join(这里是“data.csv”),schema=schema,header=True)

此答案演示如何使用
createDataFrame
create_df
toDF
创建PySpark数据帧

df=spark.createDataFrame([(“乔”,34),(“路易莎”,22)],[“名字”,“年龄])
df.show()
您还可以传递
createDataFrame
RDD和模式,以更精确地构造数据帧:

从pyspark.sql导入行
从pyspark.sql.types导入*
rdd=spark.sparkContext.parallelize([
行(name='Allie',age=2),
世界其他地区(姓名='Sara',年龄=33岁),
行(name='Grace',age=31)])
schema=schema=StructType([
StructField(“名称”,StringType(),True),
StructField(“age”,IntegerType(),False)])
df=spark.createDataFrame(rdd,模式)
df.show()
create_df
从我的项目中考虑到了两个方面的最佳效果-它简洁而全面:

从pyspark.sql.types导入*
从quinn.com导入*
df=spark.create_df(
[(“何塞”、“a”)、(“李”、“b”)、(“山姆”、“c”)],
[((“名称”,StringType(),True),(“废话”,StringType(),True)]
)
df.show()
toDF
与其他方法相比没有任何优势:

从pyspark.sql导入行
rdd=spark.sparkContext.parallelize([
行(name='Allie',age=2),
世界其他地区(姓名='Sara',年龄=33岁),
行(name='Grace',age=31)])
df=rdd.toDF()
df.show()
带格式

from pyspark.sql import SparkSession
from pyspark.sql.types import StructField, StructType, IntegerType, StringType

spark = SparkSession.builder.getOrCreate()
df = spark.createDataFrame(
    [
        (1, 'foo'),
        (2, 'bar'),
    ], StructType([StructField('id', IntegerType(), False),
                   StructField('txt', StringType(), False)])
)
print(df.dtypes)
df.show()

如果
row_in=[(1566429545575348,40.353977,-111.701859)]您的代码应该可以工作。
即使使用row_in=[(1566429545575348,40.353977,-111.701859)],这也不起作用。
(1)
是一个整数,而不是元组。当您只有1个元素时,需要添加一个coma来创建tuple
(1,)
请参阅我的答案,了解不同方法的详细讨论,以及哪种方法最适合不同的情况。未闭合的括号是语法的一部分吗?为什么需要使用空数据帧连接
乘数_df_temp
?您已经使用正确的架构创建了行。
联合
是无用的。应该避免这种方法,因为它不必要地复杂。
+-----+---+
| name|age|
+-----+---+
|Allie|  2|
| Sara| 33|
|Grace| 31|
+-----+---+
+----+----+
|name|blah|
+----+----+
|jose|   a|
|  li|   b|
| sam|   c|
+----+----+
+-----+---+
| name|age|
+-----+---+
|Allie|  2|
| Sara| 33|
|Grace| 31|
+-----+---+
from pyspark.sql import SparkSession
from pyspark.sql.types import StructField, StructType, IntegerType, StringType

spark = SparkSession.builder.getOrCreate()
df = spark.createDataFrame(
    [
        (1, 'foo'),
        (2, 'bar'),
    ], StructType([StructField('id', IntegerType(), False),
                   StructField('txt', StringType(), False)])
)
print(df.dtypes)
df.show()