Hadoop 配置单元更新列中的所有值

Hadoop 配置单元更新列中的所有值,hadoop,hive,Hadoop,Hive,我有一个外部分区的蜂箱表。其中一列是名为OLDDATE的字符串,该字符串的日期格式不同dd-MM-YY。我想更新列并以YYYY-MM-DD格式存储日期。所有年份均为20XX年 所以我想到了这个 从表中选择CONCAT'20',SPLITOLDDATE',-'[2],'-',SPLITOLDDATE',-'[1],'-',SPLITOLDDATE',-'[0] 这将以我想要的格式为我提供日期。现在,如何用新日期覆盖旧日期?您可以通过使用表本身的内容覆盖表来实现更新,只需根据您的转换更改日期字段,如

我有一个外部分区的蜂箱表。其中一列是名为OLDDATE的字符串,该字符串的日期格式不同dd-MM-YY。我想更新列并以YYYY-MM-DD格式存储日期。所有年份均为20XX年

所以我想到了这个

从表中选择CONCAT'20',SPLITOLDDATE',-'[2],'-',SPLITOLDDATE',-'[1],'-',SPLITOLDDATE',-'[0]


这将以我想要的格式为我提供日期。现在,如何用新日期覆盖旧日期?

您可以通过使用表本身的内容覆盖表来实现更新,只需根据您的转换更改日期字段,如以下伪代码:

INSERT OVERWRITE table
SELECT
    col1
  , col2
  ...
  , CONCAT('20',SPLIT(OLDDATE ,'-')[2],'-',SPLIT(OLDDATE ,'-')[1],'-',SPLIT(OLDDATE ,'-')[0]) AS olddate
  ...
  , coln
FROM table;

您可以通过使用表自身的内容覆盖表来实现更新,只需根据您的转换更改日期字段,如以下伪代码:

INSERT OVERWRITE table
SELECT
    col1
  , col2
  ...
  , CONCAT('20',SPLIT(OLDDATE ,'-')[2],'-',SPLIT(OLDDATE ,'-')[1],'-',SPLIT(OLDDATE ,'-')[0]) AS olddate
  ...
  , coln
FROM table;

由于它是一个分区表,因此必须使用日期值创建文件夹名称。 因此,您无法更新这些值

解决方法之一是创建一个新表,运行上述查询并将数据插入新表


之后,您可以删除现有表并将此新表视为所需表。

由于它是分区表,因此必须使用日期值创建文件夹名称。 因此,您无法更新这些值

解决方法之一是创建一个新表,运行上述查询并将数据插入新表

之后,您可以删除现有表并将此新表视为所需表。

@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;
@用户2441441 要覆盖分区表,请执行以下操作:

    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;

无法使用分区表:/-查询返回非零代码:40000,原因:失败:SemanticException 1:23需要指定分区列,因为目标表已分区。在标记附近遇到的错误不适用于分区表:/-查询返回非零代码:40000,原因:失败:SemanticException 1:23需要指定分区列,因为目标表已分区。在令牌附近遇到错误