Pyspark низкая производительность для ежемесячной частоты - PullRequest
2 голосов
/ 25 мая 2019

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

1 Ответ

0 голосов
/ 30 мая 2019

Я создал третью таблицу C с тремя столбцами - Start_Date End_Date Month_No 2016-01-01 2016-01-31 1 2016-02-01 2016-02-28 2 2016-03-01 2016-03-313 2016-04-01 2016-04-30 4 2016-05-01 2016-05-31 5 2016-06-01 2016-06-30 6 2016-07-01 2016-07-31 7 2016-08-012016-08-31 8 2016-09-01 2016-09-30 9 2016-10-01 2016-10-30 10 2016-11-01 2016-11-31 11 2016-12-01 2016-12-31 12, Использовал диапазон [1-12), а затем "выберите * из А, где день> = дата_даты & день <= дата_конца & месяц_но = '{0}'". Формат (i [0]).Вызывается цикл, который решил код. </p>

...