[英]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
我可能会迟到回复,但可以尝试以下步骤:
首先设置以下属性:
Ø set hive.exec.dynamic.partition.mode=nonstrict; Ø set hive.exec.dynamic.partition=true;
首先创建临时表:
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");
在临时表中加载数据:
hive> LOAD DATA INPATH 'filepath/employee.csv' OVERWRITE INTO TABLE employee;
创建分区表:
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");
从中间表/临时表将数据加载到分区表中:
INSERT OVERWRITE TABLE employee_part PARTITION (SALARY) SELECT * FROM employee;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.