2017-09-07 39 views
0

有沒有一種方法可以解開Pyspark中元組中的元組? 的數據是這樣的:解開pyspark中的元組

[('123', '0001-01-01', '2500-01-01', (26, 'X', 'A', '4724', '4724')), ('123', '0001-01-01', '2500-01-01', (21, 'S', 'A', '8247', '8247'))] 

我希望它看起來像:

[('123', '0001-01-01', '2500-01-01', 26, 'X', 'A', '4724', '4724'), ('123', '0001-01-01', '2500-01-01', 21, 'S', 'A', '8247', '8247')] 
+4

假設他們都是相同的結構:'圖(拉姆達X:X [: -1] + x [-1])'? – AChampion

+0

工作。謝謝:) @AChampion – iratelilkid

+0

@IzaakvanDongen列表理解在「Pyspark」 - 一個集羣計算框架(分佈式Map/Reduce)中不會真正起作用。 – AChampion

回答

0

試試這個:

example = [('123', '0001-01-01', '2500-01-01', (26, 'X', 'A', '4724', '4724')), ('123', '0001-01-01', '2500-01-01', (21, 'S', 'A', '8247', '8247'))] 
[tuple(x[:3]) + (x[3]) for x in example] 

結果:

[('123', '0001-01-01', '2500-01-01', 26, 'X', 'A', '4724', '4724'), ('123', '0001-01-01', '2500-01-01', 21, 'S', 'A', '8247', '8247')] 
+0

硬編碼索引產生一個不易泛化的函數。 –

+0

@Jack_The_Ripper - 我同意,也許我信任太多的用戶的編碼能力,通過假設他可以將其包裝到一個函數 –

2
def unpack(record): 
    unpacked_list = [] 
    for obj in record: 
     if isinstance(obj, tuple): 
      for obj_elem in obj: 
       unpacked_list.append(obj_elem) 
     else: 
      unpacked_list.append(obj) 
    return tuple(unpacked_list) 

example_rdd = example_rdd.map(unpack) 
0

正如意見建議的AChampion,您可以使用map(lambda x: x[:-1] + x[-1])如下:

data = sc.parallelize([ 
    ('123', '0001-01-01', '2500-01-01', (26, 'X', 'A', '4724', '4724')), 
    ('123', '0001-01-01', '2500-01-01', (21, 'S', 'A', '8247', '8247')) 
]) 

data.map(lambda x: x[:-1] + x[-1]).collect() 

這給:

[('123', '0001-01-01', '2500-01-01', 26, 'X', 'A', '4724', '4724'), 
('123', '0001-01-01', '2500-01-01', 21, 'S', 'A', '8247', '8247')] 
+0

硬編碼索引導致一個函數,不容易一般化 –

+0

我會在這裏爭論吻,有沒有跡象表明這個問題需要被推廣。雖然你的解決方案更通用,但我想發佈這個更簡單的實現來補充你的答案,因爲它更容易理解。 – Jaco