Apache spark 如何附加两个字典rdd并形成一个字典rdd以发送到pyspark中的kafka主题?

Apache spark 如何附加两个字典rdd并形成一个字典rdd以发送到pyspark中的kafka主题?,apache-spark,pyspark,Apache Spark,Pyspark,我有一个dict obj表格:- obj = {'owner_id': '3', 'url_id': [1,2,3,4], 'url': ['a','b','c','d'], 'campagin_id': '2'} 这是我从卡夫卡制作人发送给pyspark的用于数据转换的口述。现在,我要形成的数据如下所示:- new_obj = {"data": {"owner_id": obj['owner_id'], 'campaign_id': {'url': {'1': 'a', '2':'b', '

我有一个dict obj表格:-

obj = {'owner_id': '3', 'url_id': [1,2,3,4], 'url': ['a','b','c','d'], 'campagin_id': '2'}
这是我从卡夫卡制作人发送给pyspark的用于数据转换的口述。现在,我要形成的数据如下所示:-

new_obj = {"data": {"owner_id": obj['owner_id'], 'campaign_id': {'url': {'1': 'a', '2':'b', '3':'c', '4':'d'}}}
我可以建立url字典,但现在我无法访问所有者id和活动id以及其他数据

lines = kafka_stream.map(lambda x: json.loads(x[1]))
url_ids = lines.map(lambda line: line['url'])
urls = lines.map(lambda line: line['url_id'])
combine = url_ids.union(urls).reduce(lambda x, y: dict(zip(y, x)))

正如你所看到的,我想使用RDD和combine RDD这两行来形成我想要的对象,但我不知道如何将这两行结合起来。如何访问对象的所有者id和活动id键、值和形式。

如果我理解正确,您可以执行以下操作:

lines.map(lambda x: {"data": { "owner_id":x['owner_id'], 'campagin_id':{'url':dict(zip(x['url_id'], x['url']))}}}) \
     .collect()

#[{'data': {'owner_id': '3',
#  'campagin_id': {'url': {1: 'a', 2: 'b', 3: 'c', 4: 'd'}}}}]

如果您需要实际的活动id,而不是上面数据目录第二个键中的文字活动id,只需将代码中的“活动id”更改为x[“campagin\u id”]。

是的,我尝试过这个方法,但问题是我的url和url id列表非常大,因此spark不会只压缩三到四个元素。这就是为什么我必须把它们提取出来,分别加入它们@jxc@PrithviSingh,此代码中使用的zip函数是纯python代码。因为您已经从json字符串中解析了整个数据,所以不太可能是内存问题。如果zip函数只包含3到4个元素,请确保url和url_id的列表大小相同。对于您提出的方法,在Spark环境中,分区后无法保证url及其在另一个RDD上的相关url\u id位于同一分区上,如果没有唯一的\u id链接它们,您的数据将完全混乱。是的url和url\u id列表大小相同。链接它们的唯一\u id?这到底意味着什么?@PrithviSingh,您的联合rdd将不起作用,因为工会不会将相关url和url\u id并排排列,以便您可以压缩它们。reduce根本不是这里使用的正确函数。对于zip函数的问题,您必须添加更多细节,为什么只有3到4个从zip获得输出,而url和url_id中可能有100个条目。这更多是python的故障排除问题,而不是spark的问题。是的,我知道了。所以早些时候,当我试图在它们上做压缩时,只有2到4个元素才会出现。但我又试了一次,成功了。谢谢你的意见。