【发布时间】:2015-10-16 05:18:21
【问题描述】:
到目前为止我所拥有的是:
lookup = sc.textFile("/user/myuser/lookup.asv")
lookup.map(lambda r: r.split(chr(1)) )
现在我的 RDD 看起来像
[
[filename1, category1],
[filename2, category2],
...
[filenamen, categoryn]
]
如何将该 RDD 转换为广播字典,例如:
{filename1: category1, filename2: category2, ...}
这是我尝试过但不起作用的方法:
>>> broadcastVar = sc.broadcast({})
>>> data = sc.parallelize([[1,1], [2,2], [3,3], [4,4]])
>>> def myfunc(x):
... broadcastVar[str(x[0])] = x[1]
...
>>> result = data.map(myfunc)
>>> broadcastVar
<pyspark.broadcast.Broadcast object at 0x7f776555e710>
>>> broadcastVar.value
{}
>>> result.collect()
...
ERROR: TypeError: 'Broadcast' object does not support item assignment
...
>>> broadcastVar.value
{}
有关我为什么要构建这个巨大的查找变量的更多信息,请阅读以下内容:
这是one 的后续问题。
我有两张桌子
table1:一个非常宽(25K 列和 150K 行)的表,其中每列包含像素信息,第一列是输入图像文件的文件名。
table2:一个 TSV(制表符分隔文件)文件,有 300 万行,每行包含图像文件名和图像的产品类别。
在 SQL 中,我需要对文件名上的这两个表进行内部连接,以便我可以标记图像数据以供以后进行机器学习。
在任何类型的 SQL 中执行此操作都是不现实的,因为您必须为 table1 创建一个具有 25K 列的表,创建表的语法会很长。
然后我正在考虑使用 table2 创建一个查找变量,并可能使其成为一个广播变量,其中键是文件名,值是产品类别。
【问题讨论】:
标签: python apache-spark