我将cloudera发行版与hive版本“hive-common-1.1.0-cdh5.14.0”一起使用,即hive 1.1.0版本。
下面是我的Hive表:
hive> describe test;
OK
id int
name string
day date
Time taken: 0.295 seconds,
配置单元表中的数据:
hive> select * from test;
OK
1 ABC NULL
2 BCD NULL
3 CDE NULL
4 DEF NULL
1 ABC 2018-01-31
2 BCD 2018-01-31
3 CDE 2018-02-01
4 DEF 2018-02-01
Time taken: 0.375 seconds, Fetched: 8 row(s)
下面是我的设想:
1. I need to update present/today's date replacing "NULL" in first 4 records.
2. I have a text file containing update records for record 3,4 as shown below:
3,XYZ,2018-02-01
4,TUV,2018-02-01
所以现在我需要替换配置单元表中2018-02-01日期的列名。如果我尝试重写并插入到表中,则会删除完整的表数据,并且只插入新的文本文件数据。但我只需要更新新记录。我们如何执行相同的操作以获得以下输出:
上述场景的预期输出:场景1:
1 ABC 2018-02-01
2 BCD 2018-02-01
3 CDE 2018-02-01
4 DEF 2018-02-01
1 ABC 2018-01-31
2 BCD 2018-01-31
3 CDE 2018-02-01
4 DEF 2018-02-01
场景2:
1 ABC 2018-02-01
2 BCD 2018-02-01
3 CDE 2018-02-01
4 DEF 2018-02-01
1 ABC 2018-01-31
2 BCD 2018-01-31
3 XYZ 2018-02-01
4 TUV 2018-02-01
请在同样的问题上帮助我。有没有其他的方法来实现这一点。如果这可以实现使用Spark和scala请提到相同的。提前谢谢。
3条答案
按热度按时间jdgnovmf1#
在公共列上连接两个集合,生成时检查日期是否为空,将当前日期/所需值推送到该列。
8tntrjer2#
在文本文件上安装一个外部表,比如tmp表。在day colum上对目标表进行2分区。3-使用pig连接两个表,然后对其进行迭代,从连接的前半部分获得新记录,从后半部分获得其余未更新的记录,丢弃旧记录。4覆盖表,所以现在整个表不会更新,只有更新的分区才会更新。
mec1mxoz3#
创建总共有四列的tablea(额外的列-lastupdatetime),如下所示。
允许将包含更新记录的文本文件存储为temp\u tableb。
现在合并两个表(tablea和temp\ u tableb)中的记录并插入temp\ u tablec。
使用下面的查询只选择每个“id”和“day”的最新记录,并用今天的日期替换空值。
最终输出: