我试图堆叠两个汇总统计数据的小数据帧,每个数据帧具有相同顺序的相同列并匹配dtypes。第一个数据帧只是在我的主数据帧(的一个子集)上调用describe
的结果;第二种是我收集的两种类型的摘要统计数据,并希望附加到第一种。当我尝试df1.unionAll(df2)
时,我收到以下错误:
Py4JJavaError:调用o330.collectToPython时发生错误。 : org.apache.spark.SparkException:任务不可序列化
但是,如果我将它们收集到列表中,连接它们然后再次并行化它们就可以了。
df1_c = df1.collect()
df1_c
[Row(摘要= u' count',C0 = u' 3526154',C3 = u' 3526154',C4 = u' 1580402', C5 = u' 3526154',C6 = u' 3526154'),行(摘要= u'表示', C0 = u' 5.50388599500189E11',C3 = u' 4.178168090221902', C4 = u' 234846.78065481802',C5 = u' 5.134865351881966', C6 = u' 354.7084951479714'),Row(摘要= u' stddev', C0 = u' 2.5961123619752225E11',C3 = u' 0.34382335723646484', C4 = u' 118170.68592261615',C5 = u' 3.3833930336063456', C6 = u' 4.011812510792076'),行(摘要= u' min',C0 = u' 100002091588', C3 = u' 2.75',C4 = u' 0.85',C5 = u' -1',C6 = u''),Row(摘要= U'最大&#39 ;, C0 = u' 999995696635',C3 = u' 6.125',C4 = u' 1193544.39',C5 = u' 34', C6 = U' 480&#39)]
df2_c = df1.collect()
df2_c
[行(摘要= u'倾斜',C0 = u' -0.00183847089857',C3 = u' 0.519799339496', C4 = u' 0.758411576756',C5 = u' 0.286480156084',C6 = u' -2.69765201567'), 行(摘要= u' kurtosis',C0 = u' -1.19900726351',C3 = u' 0.126057726847',C4 = u' 0.576085602656', C5 = U' 0.195187780089&#39 ;, C6 = U' 24.7237858944&#39)]
dd1 = df1.collect()
dd2 = df2.collect()
dd3 = dd1 + dd2
new_df = sc.parallelize(dd3).toDF()
new_df.show()
(一个新的数据框与前两个堆叠的方式一样 应该是,但在这里看起来很乱,因为它太大了所以我不能把它关掉)
我还可以在每个收集的列表上并行化并调用toDF
,然后在新的数据框上调用unionAll
,这样就可以了。此操作应该只发生在小型数据集,因为它只是摘要统计数据,但必须首先将它们收集到列表中显然不是正确的。我过去曾成功地在数据框架上使用unionAll
而没有问题。从describe
创建的数据框和从parellizing Row
对象创建的另一个数据框有什么不同吗?它们使用show
看起来相同,并且在收集时 - 上面的collect
输出是我遇到问题的实际数据。任何有关为什么unionAll
在这里感到不安的见解都会很棒。
编辑:令我沮丧的是,我一直无法将这个作为玩具数据的最小可重复示例 - 也就是说,如果我将一些随机值并行化,描述它们,然后创建一行并尝试将其堆叠起来描述,它工作正常。这表明我的数据或方法中有一些特定的东西会以某种方式抛弃它。显然,这使得在这里寻找解决方案的前景变得更加苗条,所以我提前道歉。
答案 0 :(得分:0)
正如@ zero323建议的那样,这是作为Spark JIRA上的一个错误打开的。详细信息:https://issues.apache.org/jira/browse/SPARK-16449