В моем кадре данных, полученном 10,0000 столбцов, я должен применить некоторую логику для каждой группы (ключ - регион и отдел). Каждая группа будет использовать максимум 30 столбцов из столбцов 10k, список из 30 столбцов - из второго столбца набора данных «colList». Каждая группа будет иметь 2-3 миллиона строк. Мой подход состоит в том, чтобы выполнять групповую функцию и функцию вызова, как показано ниже. Но это не удается - 1. перетасовать и 2.data группа больше, чем 2G (может быть решена путем повторного раздела, но его дорого), 3. очень медленноВыбор случайных столбцов для каждой группы pyspark RDD/dataframe
def testfunc(iter):
<<got some complex business logic which cant be done in spark API>>
resRDD = df.rdd.groupBy(region, dept).map(lambda x: testfunc(x))
Вход:
region dept week val0 val1 val2 val3 ... val10000
US CS 1 1 2 1 1 ... 2
US CS 2 1.5 2 3 1 ... 2
US CS 3 1 2 2 2.1 2
US ELE 1 1.1 2 2 2.1 2
US ELE 2 2.1 2 2 2.1 2
US ELE 3 1 2 1 2 .... 2
UE CS 1 2 2 1 2 .... 2
Колонны выбрать для каждой группы: (набор данных 2)
region dept colList
US CS val0,val10,val100,val2000
US ELE val2,val5,val800,val900
UE CS val21,val54,val806,val9000
Моя вторая решение создать новый набор данных из входных данных только 30 столбцов и переименовывать столбцы col1 в col30. Затем используйте список сопоставлений для каждого столбца и группы. Тогда я могу применить groupbyKey (предполагается), который будет Скиннером, чем исходный ввод столбцов 10K.
region dept week col0 col1 col2 col3 ... col30
US CS 1 1 2 1 1 ... 2
US CS 2 1.5 2 3 1 ... 2
US CS 3 1 2 2 2.1 2
US ELE 1 1.1 2 2 2.1 2
US ELE 2 2.1 2 2 2.1 2
US ELE 3 1 2 1 2 .... 2
UE CS 1 2 2 1 2 .... 2
Может ли кто-нибудь помочь преобразовать вход с 10K в 30 столбцов? Или любая другая альтернатива должна быть прекрасной, чтобы избежать группировки.
Thanks Assaf, Да, я следую тому же, создал карту dict и создал 30 столбцов, которые одинаковы для всех комбинаций. Я наклоняю цикл, потому что у меня есть 2K комбинации. Каждый цикл не будет использовать весь кластер. Одна проблема с картой каждой строки заключается в том, что она занимает 30 минут для строк 5M. Любое предложение? – Harish
Если вы можете поделиться своим кодом, я могу попытаться что-то выяснить. –