【问题标题】:How to merge rows in hive?如何合并hive中的行?
【发布时间】:2018-05-17 02:29:36
【问题描述】:

我在 hive 中有一个生产表,它每天从外部源获取增量(更改的记录/新记录)数据。因为行中的值可能分布在不同的日期,例如,这就是表中记录在第一天的样子

+---+----+----+
| id|col1|col2|
+---+----+----+
|  1|  a1|  b1|
|  2|  a2|    |
|  3|    |  b3|
+---+----+----+

第二天,我们得到关注 -

+---+----+----+
| id|col1|col2|
+---+----+----+
|  4|  a4|    |
|  2|    | b2 |
|  3|  a3|    |
+---+----+----+
which has new record as well as changed records

我想要实现的结果是,基于主键(在本例中为 id)合并行并生成和输出 -

+---+----+----+
| id|col1|col2|
+---+----+----+
|  1|  a1|  b1|
|  2|  a2| b2 |
|  3|  a3|  b3|
|  4|  a4|  b4|
+---+----+----+

列数非常多,通常在 100-150 之间。目的是提供迄今为止收到的所有数据的最新完整视图。我怎样才能在 hive 本身内做到这一点。 (ps:不用排序)

【问题讨论】:

  • 我不明白数据是什么样子的。第一天的数据第二天去哪里了?
  • 对不起,我应该解释得更好。第一次的数据保留在表中,第二天的数据作为 csv 文件接收,我必须将其加载到现有的 hive 表中,以构建最终结果看起来像上面的输出
  • @leftjoin 谢谢,这确实有效
  • PK 列中的空字符串(我的意思是加入键)最好在加入前转换为 NULL,这样可以保证它们不会加入并产生倾斜和其他副作用,例如加入后的重复。

标签: sql merge hive hiveql snapshot


【解决方案1】:

这可以使用 COALESCE 和完全外连接归档。

        SELECT COALESCE(a.id ,b.id) as id ,
            COALESCE(a.col1 ,b.col1) as  col1,
            COALESCE(a.col2 ,b.col2) as col2 
        FROM tbl1 a 
        FULL OUTER JOIN table2 b
           on a.id =b.id  

【讨论】:

  • 这是一个很好的解决方案,但不幸的是它不能很好地与 hive 一起使用,因为 hive 对 null 和空白空间的处理方式不同。所以当有字符串列时,COALESCE 会失败。
  • 使用 TBLPROPERTIES('serialization.null.format'='') stackoverflow.com/questions/43263038/… 修剪字符串,即 trim(col1) 并将它们设为 null 或使用 case 语句检查 null 或空白字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多