【问题标题】:How to select last NON-NULL values of each column in a Hive partition如何选择 Hive 分区中每列的最后一个非空值
【发布时间】:2014-11-11 15:40:52
【问题描述】:

我有一个 hive-table 包含表单的事务数据(高度简化)

id  Status  Value   UpdatedTimeStamp

515 Open    1   2014-05-08T11:43:27
516 Open    NULL    2014-05-08T11:43:27
515 Answered    1   2014-05-09T11:43:27 
515 Closed  NULL    2014-05-10T11:43:27
517 Open    NULL    2014-05-09T11:43:27
516 Closed  NULL    2014-05-09T11:43:27

对于我的用例,我需要一个包含唯一 id 的输出表,其中列条目作为该列中该特定 id 按时间戳排序时的最后一个非 NULL 值。

因此,所需的输出是:

id  Status  Value   UpdatedTimeStamp

515 Closed  1   2014-05-10T11:43:27
516 Closed  NULL    2014-05-09T11:43:27
517 Open    NULL    2014-05-09T11:43:27

我正在尝试通过在分区上使用窗口函数来实现这一目标

INSERT OVERWRITE TABLE testSample2 SELECT id, FIRST_VALUE (Status) OVER SortedData, FIRST_VALUE (Value IGNORE NULLS) OVER SortedData, FIRST_VALUE (UpdatedTimeStamp) OVER SortedData FROM testSample WINDOW SortedData (PARTITION BY id ORDER BY UpdatedTimeStamp DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING);

这给了我 NullPointerException(可能 Hive 尚不支持 IGNORE NULLS)。请建议我如何取最后一个非 NULL 值。

【问题讨论】:

  • 如果您为每个 id 选择“最后一个非 NULL”值,那么为什么您想要的结果中有 NULL 值?
  • 如果特定 queryID 没有非 NULL 值,则存在 NULL 值
  • 您所说的与“每个 ID 的最后一个值”有何不同。 ?
  • 如果最后一个值为 NULL,那么该 id 的“最后一个值”将为 NULL,对吗?但我希望该值是最后一个 NON NULL 值。例如,对于 id=515 ,“Value”列的最后一个值为 NULL,但在我更新的表中,“Value”列是 1。

标签: sql hive partition windowing


【解决方案1】:

尝试使用这样的东西:

select ss.vl1, FIRST_VALUE(ss.ky) OVER (PARTITION BY ss.vl1 ORDER BY ss.nl, ss.vl rows unbounded preceding) 
FROM (
    SELECT IF(s.vl=123456, 'sasa', 'AAAAAA') as vl1, s.vl, s.ky, IF(s.ky IS NULL, 1, 0) as nl
    FROM (
        select explode(map(NULL, 123, 1, 1234, 2, 12345, 3, 123456)) as (ky, vl) from default.dual) s ) ss;
vl1     _wcol0
AAAAAA  1
AAAAAA  1
AAAAAA  1
sasa    3

【讨论】:

    猜你喜欢
    • 2015-09-17
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 2021-12-05
    • 2014-08-09
    • 1970-01-01
    相关资源
    最近更新 更多