У меня есть Dataframe в Spark, который зарегистрирован как таблица с именем A
и имеет 1 billion
записей и 10 столбцов. Первый столбец (ID) - это первичный ключ.
Также имеется другой Dataframe, который зарегистрирован как таблица с именем B
и имеет 10,000
записей и 10 столбцов (те же столбцы, что и в таблице A, первый столбец (ID) является первичным ключом).
Записи в таблице B являются «Обновлять записи». Поэтому мне нужно обновить все 10000 записей в таблице A с записями в таблице B.
Сначала я попытался выполнить этот запрос SQL:
select * from A where ID not in (select ID from B)
, а затем объединить его с таблицей B .
Подход в порядке, но первый запрос (select * from A where ID not in (select ID from B)
) чрезвычайно медленный (часы на умеренном кластере).
Затем я попытался ускорить первый запрос с помощью LEFT JOIN:
select A.* from A left join B on (A.ID = B.ID ) where B.ID is null
Этот подход логично выглядит логично, но он занимает ПУТЬ много памяти для контейнеров Spark
(YARN for exceeding memory limits. 5.6 GB of 5.5 GB physical memory used. Consider boosting spark.yarn.executor.memory
) ..
Что было бы лучше / быстрее / меньше потребляет память подход?