如何将一行返回到数据框中

How do you get a row back into a dataframe

这应该是一个简单的测试,将我的数据帧的第一行移动到一个新的数据帧中。

第一期 df.first() returns "row" 不是数据框。 下一个问题,当我尝试使用 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'>"

这就是印刷品向我展示的...

Row(entity_name='parquet/assignment/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', '\n
180,191454773838,2001,10/1/2019,84009248020191000,6,840092480,1791301010,711,V1\n\t\t\t\t\t'], data_schema=['StringType', 'StringType', 'StringType', None, 'StringType', 'IntegerType', 'StringType', 'StringType', 'StringType', 'StringType', 'StringType'])

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

我在 pyspark(当前版本)中使用 Azure databricks。我更愿意继续使用 pyspark,而不是 R,而不是 Scala,并且不必转换为 pandas 并冒着我的数据在所有这些语言之间转换时被破坏的风险。

根据文档,createDataFrame 函数采用 RDD、list 或 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| 
+------+----+-----+-------+