我有一个Hive表(my_table),它是ORC格式,有30列。其中两列(col_us,col_ds)存储的数值可以为0或null或某个整数。该表按日和小时划分。 该表有大约。 8百万x 96条记录在一个天分区中,我指的是15个每日分区
当前,我正在运行单独的查询,以使用等级函数来检索值大于0的前500条记录。一个查询检索col_us,另一个查询检索col_ds
当col_DS为0或为null时,clo_US可能具有数字值
问题: 我想通过一个查询从每个列中检索前500个非null和非0记录。
我的查询:
From(
SELECT D.COL_US, D.DATESTAMP,
ROW_NUMBER() OVER (PARTITION BY D.ID,D.SUB_ID ORDER BY CONCAT (D.DATESTAMP,D.HOURSTAMP,D.TIMESTAMP) DESC) AS RNK
FROM ${wf_table_name} D
WHERE DATESTAMP >= '${datestamp_15}' AND DATESTAMP < '${datestamp}'
AND COL_US > 0)T
INSERT OVERWRITE TABLE ${wf_us_table}
SELECT T.COL_US, T.DATESTAMP, T.RNK WHERE T.RNK < 500;
答案 0 :(得分:0)
根据您的查询,我可以猜测您正在尝试根据日期/时间从表中获取前500行,这意味着最新的500行,其中col_us和col_ds的值均大于0,但每个行的前500位都不是这些列中。 根据您的问题,您的表可能具有2种类型的值。例如。
col_us
0
NULL
10
5
col_ds
5
10
0
NULL
,或者两列的值都可能大于0。 因此,不要在WHERE子句下使用“ AND(COL_US> 0和col_ds> 0)”来代替“ AND COL_US> 0” 但是在这种情况下,您将无法从上述4行获得任何值。 因此,如果您想从col_us和5,10 col_ds一起获得10,5,那么我应该说使用单个查询是不可能的。
同样,根据您的问题所述,“我想从一个查询的每个列中检索前500个非null和非0记录。” , 我猜想您想从col_us获取前500条记录,col_ds取决于col_us / col_ds的值,那么您必须在rank子句中使用这些列而不是日期/时间。
您要检索的内容可能会通过UPDATE查询获得,具体取决于其他可用列,但在此之前,我想请您准确地共享您想要的内容(基于col_us / col_ds排名前500位或最新的500位)以及您的基本目标表结构。