Я хочу разделить RDD на несколько RDD на основе значения в строке. Значения в строках заранее известны и фиксированы по своей природе.
например
source_rdd = sc.parallelize([('a',1),('a',2),('a',3),('b',4),('b',5),('b',6)])
следует разделить на два RDD, один из которых содержит только a
, а другой — только b
в качестве ключей.
- Я попробовал метод
groupByKey
и смог успешно выполнить его после выполнения операцииcollect()
над сгруппированным RDD, которую я не могу выполнить в рабочей среде из-за нехватки памяти.
a_rdd, b_rdd = source_rdd.keyBy(lambda row: row[0]).groupByKey().collect()
- Текущая реализация заключается в применении нескольких операций фильтрации для получения каждого RDD.
a_rdd = source_rdd.filter(lambda row: row[0] == 'a')
b_rdd = source_rdd.filter(lambda row: row[0] == 'b')
Можно ли это оптимизировать дальше, как лучше всего это сделать в производстве с данными, которые не помещаются в память?
Использование: эти RDD будут преобразованы в разные кадры данных (по одному для каждого ключа), каждый с другой схемой и сохранен в S3 в качестве вывода.
Примечание. Я бы предпочел pyspark
реализацию. Я прочитал много ответов и блогов о переполнении стека и так и не смог найти, что еще работает для меня.
Я уже видел вопрос, помеченный как дубликат, о котором я уже упоминал в своем вопросе. Я задал этот вопрос, так как предоставленное решение кажется не самым оптимизированным и ему уже 3 года.
collect
илиgroupBy
26.11.2018