使用 INSERT OVERWRITE DIRECTORY 从 HIVE 表插入 HDFS 失败

Posted

技术标签:

【中文标题】使用 INSERT OVERWRITE DIRECTORY 从 HIVE 表插入 HDFS 失败【英文标题】:Failed to insert into HDFS from HIVE table using INSERT OVERWRITE DIRECTORY 【发布时间】:2014-07-15 05:02:19 【问题描述】:

我的主要需求是使用 INSERT OVERWRITE uery 从 HIVE 加载 HDFS 中的文件。在此查询中,我尝试加入 3 个配置单元表。以下是查询:

select * FROM 
    AGG_CUSTOMER_EXPSR_DRV_HIVE DRV 
LEFT OUTER JOIN 
    AGG_CUSTOMER_EXPSR_SRC_HIVE SRC 
ON 
    (SRC.CUSTOMER_ID = DRV.CUSTOMER_ID) 
    AND (SRC.AGGREGATION_LEVEL_CD = DRV.AGGREGATION_LEVEL_CD) 
    AND (SRC.PRODUCT_GROUP_CD = DRV.PRODUCT_GROUP_CD) AND (SRC.SRC_SYS_CD = DRV.SRC_SYS_CD) 
LEFT OUTER JOIN 
    ALTERNATE_IP_HIVE AIP1 
ON 
    (DRV.DERIVED_CUSTOMER_ID = AIP1.IP_ID) AND (AIP1.IP_TYPE_CD IN (1, 4)) 
LEFT OUTER JOIN 
    ALTERNATE_IP_HIVE AIP3 
ON 
    (SRC.FINANCIAL_RPTNG_UNIT_ID = AIP3.IP_ID) AND (AIP3.IP_TYPE_CD = 3) 
WHERE EXCLUDE_IND ='N';

但我收到如下错误: -sh: syntax error near unexpected token(`

有人可以帮我找出问题吗?

注意:我已经删除了 SELECT 子句中的字段。

【问题讨论】:

【参考方案1】:

如果您在 hive 中创建了一个包含上述 sql 的结果字段数量的表,那么您可以简单地做

INSERT OVERWRITE TABLE <database_name.your_created_table_name> SELECT * FROM 
    AGG_CUSTOMER_EXPSR_DRV_HIVE DRV 
LEFT OUTER JOIN 
    AGG_CUSTOMER_EXPSR_SRC_HIVE SRC 
ON 
    (SRC.CUSTOMER_ID = DRV.CUSTOMER_ID) 
    AND (SRC.AGGREGATION_LEVEL_CD = DRV.AGGREGATION_LEVEL_CD) 
    AND (SRC.PRODUCT_GROUP_CD = DRV.PRODUCT_GROUP_CD) AND (SRC.SRC_SYS_CD = DRV.SRC_SYS_CD) 
LEFT OUTER JOIN 
    ALTERNATE_IP_HIVE AIP1 
ON 
    (DRV.DERIVED_CUSTOMER_ID = AIP1.IP_ID) AND (AIP1.IP_TYPE_CD IN (1, 4)) 
LEFT OUTER JOIN 
    ALTERNATE_IP_HIVE AIP3 
ON 
    (SRC.FINANCIAL_RPTNG_UNIT_ID = AIP3.IP_ID) AND (AIP3.IP_TYPE_CD = 3) 
WHERE EXCLUDE_IND ='N';

来自 SELECT 是您的查询。您可以查看this URL 以获取有关 hiveql 的更多帮助

【讨论】:

对不起..我的错..我尝试在 HIVE 命令提示符中运行 INSERT OVERWRITE 查询,现在它工作正常。但是下面的 CASE 语句导致了一个问题: CASE WHEN (DRV.AGGREGATION_LEVEL_CD = 1) THEN CASE WHEN (SUBSTR(AIP1.SRC_SYS_UNIQUE_KEY_TXT, 1, (INSTR(AIP1.SRC_SYS_UNIQUE_KEY_TXT, '~', 1, 1) - 1)) NOTNULL) THEN SUBSTR(AIP1.SRC_SYS_UNIQUE_KEY_TXT, 1, (INSTR(AIP1.SRC_SYS_UNIQUE_KEY_TXT, '~', 1, 1) - 1)) 失败:SemanticException [错误 10015]:第 1:1125 行参数长度不匹配 '1':函数 INSTR正好接受 2 个参数。 WHEN ('') THEN '' ELSE NULL END ELSE '' END AS OVERRIDE_FAMILY_CUSTOMER_SRC_SYS_CD, 您能否分享您的完整查询并说明您遇到的问题 实际上我的问题是,通过 INSERT OVERWRITE DIRECTORY 将表从 HIVE 导入 HDFS 时,我无法使用 JOIN。我在上面的 INSERT 中使用的查询有 INSTR、SUBSTR、NOT NULL,问题出在 INSTR 语法上。我不知道 SQL 和 HIVE-QL 之间的 INSTR 语法差异。现在它工作正常。 很高兴你让它工作了。如果可能的话,只需编辑您的问题并将您的解决方案与 cmets 一起使用,以防万一有人查看此帖子,它会对他们有所帮助。

以上是关于使用 INSERT OVERWRITE DIRECTORY 从 HIVE 表插入 HDFS 失败的主要内容,如果未能解决你的问题,请参考以下文章

✨[面试进阶]INSERT INTO 和 INSERT OVERWRITE 的区别?(Hive篇)✨

使用insert into和insert overwrite插入数据的区别Hive or Odps

使用insert into和insert overwrite插入数据的区别Hive or Odps

Hive INSERT OVERWRITE 显示错误

使用 INSERT OVERWRITE DIRECTORY 从 HIVE 表插入 HDFS 失败

Spark SQL写入Hive,同分区overwrite,不同分区insert