В улье есть две таблицы A, B. Таблица имеет следующие столбцы и разделена на основе Дня. Нам нужно извлечь данные с 1 января 2016 года по 31 декабря 2016 года. Я только что упомянул выборку, но эти записи исчисляются миллионами за 1 год. Таблица А выглядит следующим образом
ID Day Name Description
1 2016-09-01 Sam Retail
2 2016-01-28 Chris Retail
3 2016-02-06 ChrisTY Retail
4 2016-02-26 Christa Retail
3 2016-12-06 ChrisTu Retail
4 2016-12-31 Christi Retail
Table B
ID SkEY
1 1.1
2 1.2
3 1.3
Следующий запрос работает, но занимает много времени, так как количество столбцов составляет около 60 (только пример 3). производительность не очень хорошая, так как результат - обработка 1 часа 20-дневных разделов. Не могли бы вы выяснить и оптимизировать запрос.
from pyspark.sql import sparksession
from pyspark.sql import functions as F
from pyspark import HiveContext
hiveContext= HiveContext(sc)
def UDF_df(i):
print(i[0])
ABC2 = spark.sql(
"select * From A where day ='{0}'".format(i[0])
)
Join = ABC2.join(
Tab2,
(
ABC2.ID == Tab2.ID
)
).select(
Tab2.skey,
ABC2.Day,
ABC2.Name,
ABC2.Description
)
Join.select(
"Tab2.skey",
"ABC2.Day",
"ABC2.Name",
"ABC2.Description"
).write.mode("append").format("parquet").insertinto("Table")
ABC=spark.sql(
"select distinct day from A where day<= '2016-01-01' and day<='2016-12-31'"
)
Tab2=spark.sql("select * from B where day is not null")
for in in ABC.collect():
UDF_df(i)
Выше приведен код pyspark на месяц, который я рассмотрел только для проверки общего времени. Соединение B с идентификатором B и идентификатором выхода вместе с другими столбцами A. На это требуется 1 час. Есть ли лучший способ оптимизации запроса, взяв данные за 1 месяц или 1 год. А также выходная таблица разбита на 2 столбца, в которые вставляются данные, поэтому используются контексты улья.