我有一个使用相当复杂的映射函数创建的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。所以任何地方都没有字符串。我已经尝试使用来自createDataFrame
和SparkSession
的{{1}}函数将RDD转换为DF,并手动构建架构。两者都返回正常,但是如果您尝试对数据帧实际执行任何操作,则无效,失败n次错误消息,错误消息。