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

3wabscal  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(292)

我将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请提到相同的。提前谢谢。

jdgnovmf

jdgnovmf1#

在公共列上连接两个集合,生成时检查日期是否为空,将当前日期/所需值推送到该列。

8tntrjer

8tntrjer2#

在文本文件上安装一个外部表,比如tmp表。在day colum上对目标表进行2分区。3-使用pig连接两个表,然后对其进行迭代,从连接的前半部分获得新记录,从后半部分获得其余未更新的记录,丢弃旧记录。4覆盖表,所以现在整个表不会更新,只有更新的分区才会更新。

mec1mxoz

mec1mxoz3#

创建总共有四列的tablea(额外的列-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\u 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\ u tableb)中的记录并插入temp\ u 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”的最新记录,并用今天的日期替换空值。

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

相关问题