Pyspark Joing, используя месячный диапазон - PullRequest
0 голосов
/ 22 мая 2019

В Улей есть три таблицы А, Б Таблица имеет следующие столбцы и разделена на основе дня. Нам нужно извлечь данные с 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

Таблица B

ID SkEY
1  1.1
2  1.2
3  1.3

Таблица 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-31 3
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-01 2016-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

Я пытался написать код на спарк, но не сработал, и в результате появился продукт cartisa при соединении, и производительность также была очень плохой

Df_A=spark.sql("select * from A join B where a.day>=b.start_date
     and a.day<=b.end_date and b.month_no=(I)") 

Фактический вывод должен иметь код в pyspark, где A присоединяется к B, где необходимо обрабатывать каждый месяц. значение I должно автоматически увеличиваться с 1 до 12 вместе с датами месяца. Соединение B, как показано выше, и Соединение C, использующее идентификатор, а также производительность должны быть хорошими

1 Ответ

0 голосов
/ 24 мая 2019
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 where day    
='{0}'.format(i[0]))
Join=ABC2.join(Tab2.join(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)

The following query is working but taking a long time as the number of  
columns are around 60(just used sample 3). Also didn't join Table C as I 
wasn't sure how to join to avoid cartisan join. performance isn't good, am 
not sure how to optimise the query.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...