RDD 到 DF 的转换

问题描述

我是 Pyspark 的新手。我的代码如下所示。我不确定为什么 df.collect()显示所有字符串值的 None 值。

>> rdd = sc.parallelize([{'name': 'test','age': {"id": 326,"first_name": "Will","last_name": "Cur"}},{'name': 'test2','age': {"id": 751,"last_name": "Mc"}}])
>> rdd.collect()
[{'name': 'test','age': {'id': 326,'first_name': 'Will','last_name': 'Cur'}},'age': {'id': 751,'last_name': 'Mc'}}]
>> df = spark.createDataFrame(rdd)
>> df.collect()
[Row(age={'last_name': None,'first_name': None,'id': 326},name='test'),Row(age={'last_name': None,'id': 751},name='test2')]

解决方法

对于复杂的数据结构,Spark 可能难以从 RDD 推断出模式,因此您可以提供一个模式来确保正确完成转换:

df = spark.createDataFrame(
    rdd,'name string,age struct<id:int,first_name:string,last_name:string>'
)

df.collect()
# [Row(name='test',age=Row(id=326,first_name='Will',last_name='Cur')),#  Row(name='test2',age=Row(id=751,last_name='Mc'))]