我有一个外部分区的Hive表。其中一列是名为olddate的字符串,该字符串的日期格式不同(dd-mm-yy)。我想更新列并以yyyy-mm-dd格式存储日期。所有年份都是20xx年。所以我想到了这个从表中选择concat('20',split(olddate,'-')[2],'-',split(olddate,'-')[1],'-',split(olddate,'-')[0])这给了我我想要的日期格式。现在如何用新日期覆盖旧日期?
3phpmpom1#
@user2441441覆盖分区表:
INSERT OVERWRITE table PARTITION (p_col) SELECT col1 , col2 ... , CONCAT('20',SPLIT(OLDDATE ,'-')[2],'-',SPLIT(OLDDATE ,'-')[1],'- ',SPLIT(OLDDATE ,'-')[0]) AS olddate ... , coln , p_col FROM table;
wr98u20j2#
您可以通过使用表本身的内容覆盖表来实现更新,只需根据您的转换更改日期字段,如以下伪代码:
INSERT OVERWRITE table SELECT col1 , col2 ... , CONCAT('20',SPLIT(OLDDATE ,'-')[2],'-',SPLIT(OLDDATE ,'-')[1],'-',SPLIT(OLDDATE ,'-')[0]) AS olddate ... , coln FROM table;
h7appiyu3#
由于它是一个分区表,因此必须使用日期值创建文件夹名称。因此无法更新值。解决方法之一是创建一个新表,运行上面的查询并将数据插入新表。之后,可以删除现有表并将此新表视为所需表。
3条答案
按热度按时间3phpmpom1#
@user2441441覆盖分区表:
wr98u20j2#
您可以通过使用表本身的内容覆盖表来实现更新,只需根据您的转换更改日期字段,如以下伪代码:
h7appiyu3#
由于它是一个分区表,因此必须使用日期值创建文件夹名称。因此无法更新值。
解决方法之一是创建一个新表,运行上面的查询并将数据插入新表。
之后,可以删除现有表并将此新表视为所需表。