2017-01-23 67 views
0

我在Spark環境和開發中有點新意。Python中的Spark使用元組 - 我如何在加入兩個RDD後合併兩個元組

我有兩個RDDS中,我通過一個木匠合併,那木匠的結果如下:

(u'10611', ((u'Laura', u'Mcgee'), (u'66821', u'COMPLETE'))) 
(u'4026', ((u'Mary', u'Smith'), (u'3237', u'COMPLETE'))) 
(u'4026', ((u'Mary', u'Smith'), (u'4847', u'CLOSED'))) 

如果你看到我有兩個元和鑰匙,我要合併這兩個元組和把它作爲主要的和一個元組,如下所示:

(u'10611', (u'Laura', u'Mcgee', u'66821', u'COMPLETE')) 
(u'4026', (u'Mary', u'Smith', u'3237', u'COMPLETE')) 
(u'4026', (u'Mary', u'Smith', u'4847', u'CLOSED')) 

此外,我怎麼能saveAsTextFile,由製表符分隔之前格式化這個。例如

10611 Laura Mcgee 66821 COMPLETE 
4026 Mary Smith 3237 COMPLETE 
4026 Mary Smith 4847 CLOSED 

我有這樣的事情,但不知道如何與元組訪問:

.map(lambda x: "%s\t%s\t%s\t%s" %(x[0], x[1], x[2], x[3])) 

回答

2

假設你的數據是一致的格式,你可以用一個簡單的加法運算合併的元組.. 。

>>> weird = (u'10611', ((u'Laura', u'Mcgee'), (u'66821', u'COMPLETE'))) 
>>> weirdMerged = (weird[0], (weird[1][0]+weird[1][1])) 
>>> weirdMerged 
(u'10611', (u'Laura', u'Mcgee', u'66821', u'COMPLETE')) 

輸出到文本應該是簡單的,但你的古怪的結構使得它一點也奇怪。你的拉姆達不壞,但你也可以這樣做:

>>> print('\t'.join((weirdMerged[0],)+weirdMerged[1])) 
10611 Laura Mcgee 66821 COMPLETE 

我不知道這是好多了,但它的工作原理。

+0

我該怎麼做在pyspark?抱歉,我是在Python新和Spark .... –

+0

這一個工作: '合併= cust_j_orders.map(拉姆達X:(X [0],(X [1] [0] + X [1] [1] )))' –

+0

說實話,我對PySpark並不是很熟悉。我只是假設它是Python的超集,所以Python語法可以工作。 –

2

您也可以使用列表/元組的理解去做這樣的例子:

my_tuple = (u'10611', ((u'Laura', u'Mcgee'), (u'66821', u'COMPLETE'))) 
new_tuple = (my_tuple[0], tuple(j for k in my_tuple[1] for j in k)) 

輸出:

print(new_tuple) 
>>> ('10611', ('Laura', 'Mcgee', '66821', 'COMPLETE')) 

然後格式化你的輸出,你可以做這樣的事情太:

print("{0}\t{1}" .format(new_tuple[0], "\t".join(k for k in new_tuple[1]))) 

輸出:

>>> 10611 Laura Mcgee 66821 COMPLETE 
+0

我試圖它....謝謝您的回答 –

+0

歡迎如果我的回答解決你的問題,你能接受它。 –

+0

當我將它轉換爲pyspark我不能使用它,因爲某些原因,是給我的輸出是「1個\ T0」 'FMT = cust_j_orders.map( lambda(new_tuple,k):「{0} \ t {1}」.format(new_tuple [0],「\ t」.join(k for new_tuple [1])))' –