我正在使用带有 Hive 版本“hive-common-1.1.0-cdh5.14.0”的 cloudera Distribution,即 hive 1.1.0 版本。
下面是我的 hive 表:
hive> describe test;
OK
id int
name string
day date
Time taken: 0.295 seconds,
hive表中的数据:
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
所以现在我需要替换 hive 表中日期为 2018-02-01 的列名。如果我尝试覆盖并插入到表中,完整的表数据将被删除,并且只会插入新的文本文件数据。但我只需要更新新记录。我们如何执行相同的操作以获得以下输出:
上述场景的预期输出: 场景一:
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 来实现,请提及相同的内容。 提前致谢。
最佳答案
创建总共有四列的表 A(带有额外的列 - lastUpdateTime),如下所示。
TableA:
id name date lastUpdateTime
------------------------------------------
1 ABC NULL 2018-02-01 11:00:00
2 BCD NULL 2018-02-01 11:00:00
3 CDE NULL 2018-02-01 11:00:00
4 DEF NULL 2018-02-01 11:00:00
1 ABC 2018-01-31 2018-02-01 11:00:00
2 BCD 2018-01-31 2018-02-01 11:00:00
3 CDE 2018-02-01 2018-02-01 11:00:00
4 DEF 2018-02-01 2018-02-01 11:00:00
让我们将包含更新记录的文本文件存储为 temp_TableB。
temp_TableB:
id name date lastUpdateTime
------------------------------------------
3 XYZ 2018-02-01 2018-02-01 12:00:00
4 TUV 2018-02-01 2018-02-01 12:00:00
现在合并来自两个表(tableA 和 temp_tableB)的记录并插入到 Temp_tableC。
Insert into temp_TableC
select * from TableA
union all
Select * from temp_TableB;
temp_TableC:
id name date lastUpdateTime
------------------------------------------
1 ABC NULL 2018-02-01 11:00:00
2 BCD NULL 2018-02-01 11:00:00
3 CDE NULL 2018-02-01 11:00:00
4 DEF NULL 2018-02-01 11:00:00
1 ABC 2018-01-31 2018-02-01 11:00:00
2 BCD 2018-01-31 2018-02-01 11:00:00
3 CDE 2018-02-01 2018-02-01 11:00:00
4 DEF 2018-02-01 2018-02-01 11:00:00
3 XYZ 2018-02-01 2018-02-01 12:00:00
4 TUV 2018-02-01 2018-02-01 12:00:00
使用下面的查询只选择每个“id”和“day”的最新记录,并将 NULL 值替换为今天的日期。
Select c.id,c.day,
case when c.date is NULL then current_date()
else c.date as date
from temp_TableC c
join
(select id,day,max(lastUpdateTime) max_lastUpdateTime from temp_TableC group by id,day) b
c.id=b.id and c.day=b.day and c.lastUpdateTime=b.max_lastUpdateTime;
最终输出:
id name date
------------------
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
关于hadoop - 如何将文本文件中的数据覆盖到配置单元表中以替换特定日期或特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48555762/