将null替换为pig/hive中同一列中先前的已知行值

ruarlubt  于 2021-06-21  发布在  Pig
关注(0)|答案(1)|浏览(325)

我在一列中有一个空值的数据集:

price  time       id
1      12:00:00   id1
10     12:00:00   id2
NULL   12:05:00   id1
NULL   12:05:00   id2
NULL   12:10:00   id2
2      12:10:00   id1
3      12:15:00   id1
NULL   12:20:00   id1
NULL   12:25:00   id1
4      12:30:00   id1

我想为pig或hive中的每个id/时间添加一个值为null的行,该行具有先前已知的行值。
所以,输出应该是:

price  time       id
1      12:00:00   id1
10     12:00:00   id2

**1** 12:05:00   id1
**10** 12:05:00   id2
**10** 12:10:00   id2

2      12:10:00   id1
3      12:15:00   id1

**3** 12:20:00   id1
**3** 12:25:00   id1

4      12:30:00   id1

非常感谢。
编辑:这是我在hive中运行的内容:

Select price,time, id,last_value(price,true) over (partition by id order by time) as LatestPrice from table;

对于某些行(1000行),它工作得很好,但是对于一个更大的集(24m行),在完成100%mapper和100%reducer之后,作业仍然从上一天开始运行。有什么建议吗?

wecizke3

wecizke31#

你可以试试这样的。

select 
    notNullTmp.price, tmp.id, tmp.time
(
    select LAG(b.time, 1) over (PARTITION BY a.id ORDER BY a.time) as prev_time, b.time as time, b.id as id
    FROM 
    (
        select price, time, id
            from table
            where price is NOT NULL
    ) a
    JOIN 
    (
        select price, time, id
            from table
            where price is NULL
    )b 
    ON (a.id = b.id)
) tmp
JOIN 
(
    select price, time, id
        from table
        where price is NOT NULL
) notNullTmp
ON (tmp.id = notNullTmp.id AND tmp.prev_time == notNullTmp.time)

UNION

select price, time, id
    from table
    where price is NOT NULL;

其思想是将空价格记录从非空价格记录中分离出来,然后在非空价格记录中寻找一个分录的每个空价格记录id。在为每个空价格分录选取价格之后,我们将该数据与非空价格数据连接起来。

相关问题