"任务不可序列化" unionAll

时间:2016-07-07 20:58:05

标签: python apache-spark pyspark

我试图堆叠两个汇总统计数据的小数据帧,每个数据帧具有相同顺序的相同列并匹配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在这里感到不安的见解都会很棒。

编辑:令我沮丧的是,我一直无法将这个作为玩具数据的最小可重复示例 - 也就是说,如果我将一些随机值并行化,描述它们,然后创建一行并尝试将其堆叠起来描述,它工作正常。这表明我的数据或方法中有一些特定的东西会以某种方式抛弃它。显然,这使得在这里寻找解决方案的前景变得更加苗条,所以我提前道歉。

1 个答案:

答案 0 :(得分:0)

正如@ zero323建议的那样,这是作为Spark JIRA上的一个错误打开的。详细信息:https://issues.apache.org/jira/browse/SPARK-16449