优化spark分区查询

h43kikqp  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(248)

有没有更好的方法来写这个查询。。。考虑到使用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;

我的资源表由 tradeDtae 作为int
查询已连续运行数小时,但未能返回满足查询的行

stszievb

stszievb1#

分区修剪可能不起作用,因为函数应用于tradedtae列。试着在没有任何功能的情况下做这件事。而且cast(timestamp)在配置单元中也不能像您期望的那样工作,请考虑以下示例:

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时间戳转换为时间戳的正确方法是使用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()

相关问题