将RDD转换为DataFrame PySpark时出错

时间:2016-07-10 20:59:52

标签: python apache-spark pyspark pyspark-sql

我在Apache Spark做了一些研究,我面对的是一些非常奇怪的事情。请参阅以下代码:

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

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

然后我将其移动到这样的dataFrame:

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()

我有一个例外的原因: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]))       

它有效!

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

2 个答案:

答案 0 :(得分:3)

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

当我进行元组转换时,假设结构有4个字段,根据大部分数据。但在一个特定的界限上,这不是真的。

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

答案 1 :(得分:0)

这有点奇怪。 你为什么需要元组?使用地图列出工作​​正常。

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