Pyspark 在与RDD的键列对应的多个列表中添加元素

Pyspark 在与RDD的键列对应的多个列表中添加元素,pyspark,Pyspark,我有蟒蛇。我必须为多个列表添加元素。将列表1的元素1添加到列表2的元素1,然后添加到列表3的元素1。 对于加拿大,添加47,59,77作为元素1,添加97,98,63作为第二个元素,依此类推 我尝试将列表展平以添加它们,并尝试转换为dataframe,但失败了。我想通过这三种方式来实现 countryCounts = [ ('CANADA','47;97;33;94;6'), ('CANADA','59;98;24;83;3'), ('CANADA','77;63;93;86;62'), ('C

我有蟒蛇。我必须为多个列表添加元素。将列表1的元素1添加到列表2的元素1,然后添加到列表3的元素1。 对于加拿大,添加47,59,77作为元素1,添加97,98,63作为第二个元素,依此类推

我尝试将列表展平以添加它们,并尝试转换为dataframe,但失败了。我想通过这三种方式来实现

countryCounts = [
('CANADA','47;97;33;94;6'),
('CANADA','59;98;24;83;3'),
('CANADA','77;63;93;86;62'),
('CHINA','86;71;72;23;27'),
('CHINA','74;69;72;93;7'),
('CHINA','58;99;90;93;41'),
('ENGLAND','40;13;85;75;90'),
('ENGLAND','39;13;33;29;14'),
('ENGLAND','99;88;57;69;49'),
('GERMANY','67;93;90;57;3'),
('GERMANY','9;15;20;19'),
('GERMANY','77;64;46;95;48'),
('INDIA','90;49;91;14;70'),
('INDIA','70;83;38;27;16'),
('INDIA','86;21;19;59;4')
]
countryCountsRdd = sc.parallelize(countryCounts)
countryCountsSplit.collect()
countryCountsGroup=countryCountsSplit.groupByKey().mapValues(list)
countryCountsGroup.collect()
CountsSplit=countryCountsRdd.map(lambda x : (x[0], ",".join(x[1].split(';'))))
countryCountsSplit.collect()

Inputs :
Way 1
[('CANADA', [47, 97, 33, 94, 6]), ('CANADA', [59, 98, 24, 83, 3]), ('CANADA', [77, 63, 93, 86, 62]), ('CHINA', [86, 71, 72, 23, 27]), ('CHINA', [74, 69, 72, 93, 7]), ('CHINA', [58, 99, 90, 93, 41]), ('ENGLAND', [40, 13, 85, 75, 90]), ('ENGLAND', [39, 13, 33, 29, 14]), ('ENGLAND', [99, 88, 57, 69, 49]), ('GERMANY', [67, 93, 90, 57, 3]), ('GERMANY', [9, 15, 20, 19]), ('GERMANY', [77, 64, 46, 95, 48]), ('INDIA', [90, 49, 91, 14, 70]), ('INDIA', [70, 83, 38, 27, 16]), ('INDIA', [86, 21, 19, 59, 4])] 
Way 2:
[('CANADA', [[47, 97, 33, 94, 6], [59, 98, 24, 83, 3], [77, 63, 93, 86, 62]]), ('CHINA', [[86, 71, 72, 23, 27], [74, 69, 72, 93, 7], [58, 99, 90, 93, 41]]), ('INDIA', [[90, 49, 91, 14, 70], [70, 83, 38, 27, 16], [86, 21, 19, 59, 4]]), ('ENGLAND', [[40, 13, 85, 75, 90], [39, 13, 33, 29, 14], [99, 88, 57, 69, 49]]), ('GERMANY', [[67, 93, 90, 57, 3], [9, 15, 20, 19], [77, 64, 46, 95, 48]])]
Way 3:
[('CANADA', '47 ,97 ,33 ,94 ,6'), ('CANADA', '59 ,98 ,24 ,83 ,3'), ('CANADA', '77 ,63 ,93 ,86 ,62'), ('CHINA', '86 ,71 ,72 ,23 ,27'), ('CHINA', '74 ,69 ,72 ,93 ,7'), ('CHINA', '58 ,99 ,90 ,93 ,41'), ('ENGLAND', '40 ,13 ,85 ,75 ,90'), ('ENGLAND', '39 ,13 ,33 ,29 ,14'), ('ENGLAND', '99 ,88 ,57 ,69 ,49'), ('GERMANY', '67 ,93 ,90 ,57 ,3'), ('GERMANY', '9 ,15 ,20 ,19'), ('GERMANY', '77 ,64 ,46 ,95 ,48'), ('INDIA', '90 ,49 ,91 ,14 ,70'), ('INDIA', '70 ,83 ,38 ,27 ,16'), ('INDIA', '86 ,21 ,19 ,59 ,4')]

Require same output for all 3 : 
[('CANADA','183;258;150;263;71)]
[('CHINA','218,239,234,209,75')]
[('ENGLAND','178,114,175,173,153')]
[('GERMANY','144,166,151,172,70')]
[('INDIA','246,153,148,100,90')]

因此,您可以在RDD上使用一个简单的reduceByKey操作来完成它

输入RDD-RDD[字符串,列表]

输出RDD-输入.reduceByKey(x,y->addFunction(x,y))


addFunction(x,y)迭代输入列表并按索引添加元素,并返回添加的列表,因此您可以在RDD上使用简单的reduceByKey操作来完成此操作

输入RDD-RDD[字符串,列表]

输出RDD-输入.reduceByKey(x,y->addFunction(x,y))


addFunction(x,y)在输入列表上迭代并按索引添加元素,并返回添加的列表

您希望通过求和组合给定键的值。这正是
reduceByKey
所做的。您只需要定义一个关联的和可交换的reduce函数来根据需要组合这些值

def myReducer(a、b):
a、 b=map(int,a.split(“;”),map(int,b.split(“;”)
最大长度=最大长度(长度(a),长度(b))
如果len(a)
这里唯一真正棘手的部分是,示例输入列表的大小不尽相同。在本例中,我将函数定义为对较短列表进行零填充

现在调用
reduceByKey

countrysrdd.reduceByKey(myReducer.collect())
#[(‘加拿大’、‘183;258;150;263;71’),
#(‘中国’、‘218;239;234;209;75’),
#(‘印度’、‘246;153;148;100;90’),
#(‘英格兰’、‘178;114;175;173;153’),
#(‘德国’、‘153;172;156;171;51’)]

您希望通过求和来组合给定键的值。这正是
reduceByKey
所做的。您只需要定义一个关联的和可交换的reduce函数来根据需要组合这些值

def myReducer(a、b):
a、 b=map(int,a.split(“;”),map(int,b.split(“;”)
最大长度=最大长度(长度(a),长度(b))
如果len(a)
这里唯一真正棘手的部分是,示例输入列表的大小不尽相同。在本例中,我将函数定义为对较短列表进行零填充

现在调用
reduceByKey

countrysrdd.reduceByKey(myReducer.collect())
#[(‘加拿大’、‘183;258;150;263;71’),
#(‘中国’、‘218;239;234;209;75’),
#(‘印度’、‘246;153;148;100;90’),
#(‘英格兰’、‘178;114;175;173;153’),
#(‘德国’、‘153;172;156;171;51’)]

我尝试按“countryCountsGroup”分组,但它创建了嵌套列表,我无法对其进行汇总。您对德国的输出看起来不正确。你的一个条目似乎只有4个元素。是的,保罗。你是对的。德国的输出不正确。我尝试按“countryCountsGroup”分组,但它创建了嵌套列表,我无法汇总。您的德国输出看起来不正确。你的一个条目似乎只有4个元素。是的,保罗。你是对的。德国的输出不正确。谢谢Pault。如果数据不正确,则逻辑将通过将NULL替换为0来纠正。Pault请您共享myCombiner的代码。因为当我使用countryCountsReduceByKey=countryCountsSplit.reduceByKey(lambda x,y:x+y)时,它给了我[('CANADA',[47,97,33,94,6,59,98,24,83,3,77,63,93,86,62]),这是不应该的串联。@AbhinavSingh
myCombiner
是一个输入错误-它应该是
myReducer
(已修复)。您可以将其应用于
countryCountsRdd
,而不是
countCountsSplit
。你为什么要尝试自己的功能<代码>x+y
列表将连接列表。谢谢Pault。如果数据不正确,则逻辑将通过将NULL替换为0来纠正。Pault请您共享myCombiner的代码。因为当我使用countryCountsReduceByKey=countryCountsSplit.reduceByKey(lambda x,y:x+y)时,它给了我[('CANADA',[47,97,33,94,6,59,98,24,83,3,77,63,93,86,62]),这是不应该的串联。@AbhinavSingh
myCombiner
是一个输入错误-它应该是
myReducer
(已修复)。您可以将其应用于
countryCountsRdd
,而不是
countCountsSplit
。你为什么要尝试自己的功能<代码>x+y
用于列表将串联列表。