У меня две таблицы. Обе таблицы являются внешними таблицами в улье, хранящимися в формате данных паркета.
Первая таблица table_1 содержит 250 миллионов строк ежедневно с 2015 года. Эта таблица разбита на разделы на основе create_date. Таким образом, на каждую create_date приходится около 250 миллионов строк.
Вторая таблица - table_2 - ежедневная дельта-таблица, и среднее количество строк составляет около 1,5 миллиона строк.
В обеих таблицах есть один общий столбец lookup_id. Теперь мне нужно получить все столбцы из таблицы_1 для дельта-данных из таблицы_2, используя фреймы данных.
Я думал сделать что-то вроде ниже
table_1=spark.table("table_1")
table_2=spark.table("table_2")
result_df=table_1.join(table_2, table_1.lookup_id=table_2.lookup_id, "inner").drop(table_2.lookup_id)
Но я сомневаюсь, что это действительно эффективно и сможет ли pyspark справиться с этим без каких-либо ошибок памяти.
Вопрос 1: Как распараллелить сканирование table_1 на основе разделов create_date?
Вопрос 2: Есть ли другой способ оптимизировать сканирование table_1 на основе lookup_ids из table_2 и / или на основе разделов?
Дополнительная информация, чтобы лучше понять, что я ищу:
Я пытаюсь понять, когда мы присоединяемся к таблицам с использованием фреймов данных, действительно ли Spark читает данные и хранит их в памяти и присоединяется к ним, или просто присоединяется при чтении самого себя. Если второе утверждение истинно, то для каких всех соединений применим второй оператор. Также, если есть необходимость использовать цикл, чтобы избежать ошибок памяти.
table1.create_date
иtable2.create_date
? Например, верно ли, что еслиrow1.lookup_id == row2.lookup_id
, тоrow1.create_date == row2.create_date
для row1 ∈ table1 и row2 ∈ table2? - person gudok   schedule 11.07.2020