将 RDD 转换为 DataFrame PySpark 时出错

Getting Error when convert RDD to DataFrame PySpark

我正在研究 Apache Spark,我遇到了一些非常奇怪的事情。请参阅下面的代码:

ClimateRdd = ClimateRdd.map(lambda x: tuple(x))
print ClimateRdd.first()

这些命令 return 给我这一行: ('1743-11-01', '4.3839999999999995', '2.294', '\xc3\x85land')

然后我将其移动到这样的数据帧中:

schemaDf = sqlContext.createDataFrame(ClimateRdd, schema)
schemaDf.registerTempTable('globalTemp')
result = sqlContext.sql("SELECT dt FROM globalTemp")
result.show(5)

这很完美,我得到了这个结果:

+----------+
|        dt|
+----------+
|1743-11-01|
|1743-12-01|
|1744-01-01|
|1744-02-01|
|1744-03-01|
+----------+
only showing top 5 rows

获取查询结果后,尝试运行行:

dates = result.map(lambda x: "Datas: " + x.dt)
print dates.collect()

我得到了 java 的异常,原因是:Caused by: java.lang.IllegalStateException: Input row doesn't have expected number of values required by the schema. 4 fields are required while 5 values are provided.

好吧,我做了很多研究,发现了问题所在,我将代码的第一部分更改为:

ClimateRdd = ClimateRdd.map(lambda x: (x[0], x[1], x[2], x[3]))       

成功了!

重点是,为什么第一部分不起作用?为什么我必须手动生成一个元组?有没有办法动态创建这个元组?

这有点奇怪。 为什么需要元组?列表与地图配合得很好。

ClimateRdd.map(lambda x: [x[0], x[1], x[2], x[3]])       

问题是脏数据。数据不在默认拆分参数中。问题就在那里。

当我进行元组转换时,假设该结构有 4 个字段,符合大部分数据。但在某一特定行,情况并非如此。

这就是我的数据帧在元组转换中崩溃的原因。