将 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 个字段,符合大部分数据。但在某一特定行,情况并非如此。
这就是我的数据帧在元组转换中崩溃的原因。
我正在研究 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 个字段,符合大部分数据。但在某一特定行,情况并非如此。
这就是我的数据帧在元组转换中崩溃的原因。