2

В моем кадре данных, полученном 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 столбцов? Или любая другая альтернатива должна быть прекрасной, чтобы избежать группировки.

ответ

0

Вы можете использовать функцию create_map для преобразования всех столбцов 10k в карту для каждой строки. Теперь используйте UDF, который берет карту, регион и отдел, а затем заполняет карту 30 столбцами и всегда должен иметь одинаковые имена для всех 30 столбцов. Наконец, вы можете обернуть свою сложную функцию, чтобы получить карту вместо исходных столбцов 10K. Надеюсь, это будет достаточно маленьким, чтобы нормально работать.

Если нет, вы можете получить отличную от региона и отдела, и если предположить, что их достаточно, вы можете прокручивать один и группировать по другому.

+0

Thanks Assaf, Да, я следую тому же, создал карту dict и создал 30 столбцов, которые одинаковы для всех комбинаций. Я наклоняю цикл, потому что у меня есть 2K комбинации. Каждый цикл не будет использовать весь кластер. Одна проблема с картой каждой строки заключается в том, что она занимает 30 минут для строк 5M. Любое предложение? – Harish

+0

Если вы можете поделиться своим кодом, я могу попытаться что-то выяснить. –

Смежные вопросы