Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将RDD转换为数据帧Pypark时出错_Python_Apache Spark_Pyspark_Pyspark Sql - Fatal编程技术网

Python 将RDD转换为数据帧Pypark时出错

Python 将RDD转换为数据帧Pypark时出错,python,apache-spark,pyspark,pyspark-sql,Python,Apache Spark,Pyspark,Pyspark Sql,我在ApacheSpark做一些研究,我面临着一些非常奇怪的事情。请参见下面的代码: ClimateRdd = ClimateRdd.map(lambda x: tuple(x)) print ClimateRdd.first() 这些命令返回到我的这一行: ('1743-11-01','4.383999999995','2.294','xc3\x85land') 然后我将其移动到如下数据帧: schemaDf = sqlContext.createDataFrame(ClimateRdd,

我在ApacheSpark做一些研究,我面临着一些非常奇怪的事情。请参见下面的代码:

ClimateRdd = ClimateRdd.map(lambda x: tuple(x))
print ClimateRdd.first()
这些命令返回到我的这一行:
('1743-11-01','4.383999999995','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异常,原因如下:
由以下原因引起:java.lang.IllegalStateException:Input行没有架构所需的预期值数。需要4个字段,同时提供5个值。

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

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个字段,与大部分数据一致。但有一句话是不正确的


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

听起来在
ClimateRDD
中有一行包含超过4个元素。尝试执行类似
ClimateRdd.map(lambda x:(1,len(x)).countByValue()的操作
我希望您会看到包含5个元素的行。尝试检查是否有任何行包含超过4个元素。嗯,这完全有道理!我将检查我的数据集并给您所有答案。由于如果我转换一个元组,它将在RDD中的所有数据中迭代,如果它包含4个或更多元素…如果执行手动元组,则不会发生。我将检查e数据集,因为我不知道我有不同类型的列。该文件是CSV,可能是一种国家类型的名称。是的,@santon you是对的。在几行中有超过4列:
defaultdict(,{(1,5):2277,(1,4):575185})有同样的问题!有一个空行,必须通过把代码包含到过滤器列表中来去除空白行,我知道,我的意思是,要手动设置元组。但是,根据@桑顿评论。大概我的问题是RDD的大小。