Pyspark |映射JSON rdd并应用广播

Pyspark |映射JSON rdd并应用广播,pyspark,rdd,Pyspark,Rdd,在pyspark中,如何将具有JSON的输入RDD转换为下面指定的输出,同时将广播变量应用于值列表 输入 [{'id': 1, 'title': "Foo", 'items': ['a','b','c']}, {'id': 2, 'title': "Bar", 'items': ['a','b','d']}] [(1, 'Foo', [5, 12, 42]), (2, 'Bar', [5, 12, 29])] 广播变量 [('a': 5), ('b': 12), ('c': 42), ('d

在pyspark中,如何将具有JSON的输入RDD转换为下面指定的输出,同时将广播变量应用于值列表

输入

[{'id': 1, 'title': "Foo", 'items': ['a','b','c']}, {'id': 2, 'title': "Bar", 'items': ['a','b','d']}]
[(1, 'Foo', [5, 12, 42]), (2, 'Bar', [5, 12, 29])]
广播变量

[('a': 5), ('b': 12), ('c': 42), ('d': 29)]
所需输出

[{'id': 1, 'title': "Foo", 'items': ['a','b','c']}, {'id': 2, 'title': "Bar", 'items': ['a','b','d']}]
[(1, 'Foo', [5, 12, 42]), (2, 'Bar', [5, 12, 29])]

编辑:最初我的印象是传递给
map
函数的函数是自动广播的,但在阅读了一些文档后,我不再确定这一点

在任何情况下,都可以定义广播变量:

bv=[('a',5),('b',12),('c',42),('d',29)]
#翻成字典
bv=dict(bv)
广播var=sc.broadcast(bv)
打印(广播变量值)
#{'a':5,'c':42,'b':12,'d':29}
现在是。您可以使用
broascastVar.value
访问字典:

例如:

导入json
rdd=sc.parallelize(
[
“{”id“:1,“title:“Foo”,“items:[“a”,“b”,“c”]}”,
“{“id”:2,“标题”:“条”,“项目”:[“a”、“b”、“d”]}”
]
)
def myMapper(世界其他地区):
#定义输出值的顺序
键顺序=[“id”、“标题”、“项目”]
#将json字符串加载到dict中
d=json.loads(行)
#使用广播变量dict替换项目
d[“items”]=[broadcastVar.value.get(item)用于d[“items”]]中的项
#按顺序返回值
返回元组(按键顺序为k的d[k]
打印(rdd.map(myMapper.collect())
#[(1,u'Foo',[5,12,42]),(2,u'Bar',[5,12,29])]