Pyspark rdd.toDF()数据丢失

时间:2018-03-25 18:41:47

标签: pyspark broadcast

我有一个使用相当复杂的映射函数创建的RDD,它利用了一个大的广播字典。如果我查看rdd.filter(lambda x: x... == CONDITION).collect()以提取我已经看到的几个代表我的数据丢失问题的案例,那么数据是正确和完整的。然后,当我尝试df = rdd.toDF(),然后df.where(CONDITION).collect()时,数据的许多元素的大部分已被None替换。

如果这给出了任何提示,则行/元素是要素集,并且每个行都是以块的形式创建的,并且对每个块单独调用广播字典。当数据从一个数字(有时是所有实数,有时是全零,有时是1-hot)转换为None时,似乎总是在行/元素向量拼接在一起的整个块中的一个/一些上完成。

提供更好的代码示例

def map_fxn(row, n_dim, dict_bc, row_constr):
  if row['key'] in dict_bc.value:
    rvec = dict_bc.value[row['key']
  else:
    rvec = [0] * n_dim
  return row_constr(row['id'], *rvec)

my_dict = {'key1' : range(10,20), 'key2' : range(20,30)}
n_dim = 10
dict_bc = spark.sparkContext.broadcast(my_dict)
rdd = spark.sparkContext.parallelize([Row(key='key1', id='id1'), 
                                      Row(key='key3', id='id3')])
row_constr = Row('id', *['val' + str(i) for i in range(n_dim)])
rdd_map = rdd.map(lambda x: map_fxn(x, n_dim, dict_bc, row_constr)
df = rdd_map.toDF()

然后rdd_map没问题。 df随机显示的行包含None值,而不是0或dict_bc.value中的值。字典从mllib的S3输出加载,其中每个条目都保证为double。所以任何地方都没有字符串。我已经尝试使用来自createDataFrameSparkSession的{​​{1}}函数将RDD转换为DF,并手动构建架构。两者都返回正常,但是如果您尝试对数据帧实际执行任何操作,则无效,失败n次错误消息,错误消息。

0 个答案:

没有答案