如何将行返回到数据框

时间:2019-06-21 22:51:47

标签: dataframe pyspark azure-databricks

假设这是将我的数据框的第一行移至新数据框的简单测试。

第一期df.first()返回的是“行”而不是数据帧。 下一个问题,当我尝试使用spark.createDataFrame(df.first())时,它将告诉您它无法推断架构。

下一个问题spark.createDataFrame(df.first(),df.schema)不起作用。

因此对于以下原始模式:

root
 |-- entity_name: string (nullable = true)
 |-- field_name: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- data_row: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- data_schema: array (nullable = true)
 |    |-- element: string (containsNull = true)

我这样在代码中定义了模式:

xyz_schema = StructType([
 StructField('entity_name',StringType(),True)
 ,StructField('field_name',ArrayType(StringType(),True),True)
 ,StructField('data_row',ArrayType(StringType(),True),True)
 ,StructField('data_schema',ArrayType(StringType(),True),True)
])

print(xyz.first())
xyz_1stRow = spark.createDataFrame(xyz.first(), xyz_schema)

以上操作无效!我收到以下错误:

"TypeError: StructType can not accept object 'parquet/assignment/v1' in type <class 'str'>"

这是印刷品向我展示的内容...

  

行(实体名称=“镶木地板/布置/ v1”,   field_name = ['Contract_ItemNumber','UPC','DC_ID','AssignDate',   'AssignID','AssignmentQuantity','ContractNumber','MaterialNumber',   'OrderReason','RequirementCategory','MSKU'],data_row = ['\ n
  350,192660436296,2001,10 / 1 / 2019,84009248020191000,5,840092480,1862291010,711,V1 \ n \ t \ t \ t \ t \ t \ t',   '\ n
  180,191454773838,2001,10 / 1 / 2019,84009248020191000,6,840092480,1791301010,711,V1 \ n \ t \ t \ t \ t \ t \ t'],   data_schema = ['StringType','StringType','StringType',无,   'StringType','IntegerType','StringType','StringType','StringType',   'StringType','StringType'])

我在做什么错?为什么字符串类型不接受字符串?

我正在使用Azure数据块在pyspark(当前版本)中工作。我宁愿留在pyspark,而不是R,而不是Scala,也不必转换为熊猫,并且冒着我的数据在所有这些语言之间转换的风险。

1 个答案:

答案 0 :(得分:1)

根据文档,createDataFrame函数采用RDD,列表或pandas.DataFrame并从中创建数据框。因此,必须将df.first的结果放在括号中以使其成为列表。看下面的例子:

df = spark.createDataFrame(
    [('Galaxy', 2017, 27841, 17529),
     ('Galaxy', 2017, 29395, 11892),
     ('Novato', 2018, 35644, 22876),
     ('Novato', 2018, 8765,  54817)],
    ['model','year','price','mileage']
)

bla = spark.createDataFrame([df.first()])
bla.show()

输出:

+------+----+-----+-------+ 
| model|year|price|mileage| 
+------+----+-----+-------+ 
|Galaxy|2017|27841|  17529| 
+------+----+-----+-------+