hadoop - 从 Hive 中的最后一个非空值填充空值

标签 hadoop hive hiveql

我有 4 列

date   number   Estimate   Client    
----   ------
1      3          10        A 
2      NULL       10        Null
3      5          10        A      
4      NULL       10        Null 
5      NULL       10        Null
6      2          10        A   
.......

我需要用新值替换 NULL 值,新值采用日期列中前一个日期的最后一个已知值的值,例如:日期 = 2 数字 = 3,日期 4 和 5 数字 = 5 和 5。 NULL 值随机出现。

这需要在 Hive 中完成。

最佳答案

关于滑动窗口;

这是我的表格内容;

hive> select * from my_table;
OK
1       3       10      A
2       NULL    10      NULL
3       5       10      A
4       NULL    10      NULL
5       NULL    10      NULL
6       2       10      A
Time taken: 0.06 seconds, Fetched: 6 row(s)

您需要做的就是滑过前行和当前行之间的窗口,找到最近的非空值。 LAST_VALUE可窗口函数有一个参数可以忽略空值作为 bool 值。 LAST_VALUE(<field>,<ignore_nulls> as boolean) ;

SELECT
    COALESCE(`date`, LAST_VALUE(`date`, TRUE) OVER(ORDER BY `date` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)),
    COALESCE(number, LAST_VALUE(number, TRUE) OVER(ORDER BY `date` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)),
    COALESCE(estimate, LAST_VALUE(estimate, TRUE) OVER(ORDER BY `date` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)),
    COALESCE(client, LAST_VALUE(client, TRUE) OVER(ORDER BY `date` ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW))
FROM my_table;

结果会是;

OK
1       3       10      A
2       3       10      A
3       5       10      A
4       5       10      A
5       5       10      A
6       2       10      A
Time taken: 19.177 seconds, Fetched: 6 row(s)

关于hadoop - 从 Hive 中的最后一个非空值填充空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31144947/

相关文章:

hadoop - Hive 以本地模式运行,占用过多的/tmp 本地磁盘空间

time - hive 将 PHT 时间转换为 UTC

hadoop - 寻找每个赛季得分最高的主队

java - 如何使用java在hdfs中创建一个新目录?

scala - 使用 Spark Scala 将数据插入到带有 HiveContext 的 Hive 表中

java - 使用JAVA将字节流传输到HDFS

r - 如何制作 1 亿条推文的 R tm 语料库?

apache - 没有分区的 Hive 存储桶?

scala - 我们可以在IDE中使用spark.sql API创建表吗

hadoop - 无法在配置单元中创建分区