繁体   English   中英

无法加载 Hive 分区表中的数据

[英]Unable to load data in Hive partitioned table

我使用以下查询在 Hive 中创建了一个表:

create table if not exists employee(CASE_NUMBER String,
                                         CASE_STATUS String,
                                         CASE_RECEIVED_DATE DATE,
                                         DECISION_DATE  DATE,
                                         EMPLOYER_NAME STRING,
                                         PREVAILING_WAGE_PER_YEAR BIGINT,
                                         PAID_WAGE_PER_YEAR BIGINT,
                                         order_n int) partitioned by (JOB_TITLE_SUBGROUP STRING) row format delimited fields terminated by ',';
                                         

我尝试使用以下查询将数据加载到创建表中:

LOAD DATA INPATH '/salary_data.csv' overwrite into table employee  partition (JOB_TITLE_SUBGROUP);

对于分区表,我什至设置了以下配置:

set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.dynamic.partition=true;

但是我在执行加载查询时遇到以下错误:

您的查询有以下错误:

编译语句时出错:FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:Invalid partition key & values; keys [job_title_subgroup, ], values [])

请帮忙。

如果要将数据加载到 Hive 分区,则必须在LOAD DATA查询中提供分区本身的值。 所以在这种情况下,您的查询将是这样的。

LOAD DATA INPATH '/salary_data.csv' overwrite into table employee partition (JOB_TITLE_SUBGROUP="Value");

其中“值”是您加载数据的分区的名称。 原因是因为 Hive 将使用“Value”来创建要存储 .csv 的目录,这将是这样的: .../employee/JOB_TITLE_SUBGROUP=Value 我希望这会有所帮助。

查看文档以了解有关LOAD DATA语法的详细信息。

已编辑

由于该表具有动态分区,因此一种解决方案是将 .csv 加载到外部表(例如employee_external)中,然后像这样执行INSERT命令:

INSERT OVERWRITE INTO TABLE employee PARTITION(JOB_TITLE_SUBGROUP)
SELECT CASE_NUMBER, CASE_STATUS, (...), JOB_TITLE_SUBGROUP
FROM employee_external

我可能会迟到回复,但可以尝试以下步骤:

  1. 首先设置以下属性:

     Ø set hive.exec.dynamic.partition.mode=nonstrict; Ø set hive.exec.dynamic.partition=true;
  2. 首先创建临时表:

     CREATE EXTERNAL TABLE IF NOT EXISTS employee_temp( ID STRING, Name STRING, Salary STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\\n' tblproperties ("skip.header.line.count"="1");
  3. 在临时表中加载数据:

     hive> LOAD DATA INPATH 'filepath/employee.csv' OVERWRITE INTO TABLE employee;
  4. 创建分区表:

     CREATE EXTERNAL TABLE IF NOT EXISTS employee_part( ID STRING, Name STRING) PARTITIONED BY (Salary STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\\n' tblproperties ("skip.header.line.count"="1");
  5. 从中间表/临时表将数据加载到分区表中:

     INSERT OVERWRITE TABLE employee_part PARTITION (SALARY) SELECT * FROM employee;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM