2015-02-18 3 views
1

У меня есть кортеж, созданный Спарком после присоединения. Он имеет ключ, два столбца в кортеже, а затем остальные столбцы из второй таблицы. Я не обязательно знаю, сколько столбцов находится во второй таблице.Сгладить кортеж неизвестной длины

Так, например:

(2324234534, (('23213','2013/03/02'), 12.32, 32.4, 45)) 

я смог отделить кортеж, если есть один столбец после молнии, дата кортежа, как это в PySpark:

x.map(lambda p: (p[0], (p[1][0][0], p[1][0][1], p[1][1]))) 

в Python:

map(lambda p: (p[0], (p[1][0][0], p[1][0][1], p[1][1])), x) 

Это производит вывод Ищу:

(2324234534, ('23213','2013/03/02', 12.32)) 

Если я хочу больше, чем один столбец после молнии, дату, то у меня есть этот код:

x.map(lambda p: (p[0], (p[1][0][0], p[1][0][1], p[1][1:]))) 

Однако он производит этот выход:

(2324234534, ('23213','2013/03/02', (12.32, 32.4, 45))) 

В любом случае, мой текущий метод хакки и не дает результата, который я ищу. Мне интересно, может быть, узнать, как сгладить кортежи вообще (другие темы, которые я нашел в этой теме, меняют кортежи в списки, что не на 100%, что я ищу)

+0

в общем случае, это уплощения генератор выглядит хорошо для меня: http://stackoverflow.com/a/2158532/2337736 Он будет работать над любой итерацией , и вернет генератор, который вы можете использовать для создания кортежа - 'tuple (flatten (some_iterable))'. Для вашего конкретного вопроса - в вашем примере вы отбрасываете два значения (2,4 и 45). Желательно? –

+0

@PeterDeGlopper Я могу только достичь желаемой структуры, когда у меня есть только первое значение на выходе. В противном случае он печатается как кортеж. Кроме того, я попробовал код, который вы предложили, и он не работает для ввода. – Michal

+1

Вам нужно будет сделать что-то вроде 'x.map (lambda p: (p [0], кортеж (flatten (p [1]))))', чтобы сохранить единый уровень вложенности, который вы хотите, - который работает на вашем test 'p = (2324234534, (('23213', '2013/03/02'), 12.32, 32.4, 45))'. Или, по крайней мере, он сглаживает это до '(2324234534, ('23213', '2013/03/02', 12.32, 32.399999999999999, 45))', я не совсем уверен, что вы ищете. –

ответ

1

Если я понимаю ваши цели правильно, я считаю, что это делает то, что вы хотите:

In [11]: a = (2324234534, (('23213','2013/03/02'), 12.32, 32.4, 45)) 

In [12]: a[:1] + (a[1][0] + a[1][1:],) 
Out[12]: (2324234534, ('23213', '2013/03/02', 12.32, 32.4, 45)) 
Смежные вопросы