Оптимизировать запрос спарк-раздела - PullRequest
1 голос
/ 10 июля 2019

Есть ли лучший способ написать этот запрос ... учитывая миллионы строк с использованием spark и hadoop

select *
from (
SELECT *, row_number() over(PARTITION BY tran_id ORDER BY load_dt DESC) RN
FROM MySourceTable WHERE CAST(tradeDtae) as TIMESTAMP) 
BETWEEN add_months(current_timestamp(), -64) AND current_timestamp() 
AND sys_id = 'TRADING
) temp where temp.RN=1;

MySourceTable разделен на tradeDtae, так как запрос int

выполняетсяв течение нескольких часов подряд и не может вернуть строки, удовлетворяющие запросу

1 Ответ

0 голосов
/ 10 июля 2019

Сокращение раздела может не работать, потому что функция применяется к столбцу tradeDtae. Попробуйте сделать это без функции вообще. А также приведение (отметка времени) не работает так, как вы ожидаете в Hive, рассмотрим следующий пример:

hive> select unix_timestamp(current_timestamp);
OK
1562741499
Time taken: 0.739 seconds, Fetched: 1 row(s)
hive> select cast(1562741499 as timestamp);
OK
1970-01-18 18:05:41.499
Time taken: 0.191 seconds, Fetched: 1 row(s)
hive> select current_timestamp;
OK
2019-07-09 23:53:07.662
Time taken: 1.482 seconds, Fetched: 1 row(s)

Правильный метод преобразования bigint unix timestamp в timestamp использует from_unixtime:

hive> select from_unixtime(1562741499);
OK
2019-07-09 23:51:39
Time taken: 0.12 seconds, Fetched: 1 row(s)

Я предлагаю рассчитывать параметры отдельно как метки времени Unix и передавать в качестве параметров, если отсечение разделов не работает с этим запросом, попробуйте сначала:

FROM MySourceTable 
WHERE tradeDtae BETWEEN unix_timestamp(add_months(current_timestamp(), -64),'yyyy-MM-dd') AND unix_timestamp() 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...