hadoop - 如何将文本文件中的数据覆盖到配置单元表中以替换特定日期或特定值

标签 hadoop hive hdfs insert-update cloudera-cdh

我正在使用带有 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/

相关文章:

hadoop - 为什么在 HDFS 上运行的 Spark wordcount 应用程序中的位置级别都是 ANY?

hadoop - Hadoop 的 Foreman 和 Hue 有什么区别?

每个子组中的 hadoop pig 百分比

hadoop - 配置单元 : remove stuff from distributed cache

hadoop - hive -标签计数

hadoop - 防止加缪增加偏移值

hadoop - Oozie:在协调器中重新运行所有未成功的工作流

hadoop - Hive 更改外部表和更新架构

java - 是否可以在 MR 作业之外将数据写入 HDFS 并仍然使用 Hive 进行查询?

hadoop - 从 org.apache.hadoop.hive.ql.exec.DDLTask 创建配置单元表 : FAILED: Execution Error, 返回代码 1 时出错。元异常