我在 Hive 中遇到了多插入问题
FROM staged_employees se
INSERT INTO TABLE us_employees
AS SELECT * WHERE se.cnty = 'US'
INSERT INTO TABLE ca_employees
AS SELECT * WHERE se.cnty = 'CA'
...
据我所知,多插入不是 IF ... ELSE ... 构造,但是,是否可以将其变成 IF ... ELSE ... 构造?
HQL 不支持条件逻辑。关于拆分插入的问题的字面答案是:
INSERT INTO TABLE us_employees
SELECT *
FROM staged_employees se
WHERE se.cnty = 'US'
INSERT INTO TABLE ca_employees
SELECT *
FROM staged_employees se
WHERE se.cnty = 'CA'
通过拆分查询,您将完成的所有操作都是从staged_employees
表中读取所有数据两次。并且,可能会使集群的其他用户非常恼火。
尽管这是一个老问题,但下图可能对 Edward Capriolo、Dean Wampler 和 Jason Rutherglen 的 Programming Hive 一书有所帮助,第5章第 76 页
用于编写多个插入语句的 hive 命令片段
用OVERWRITE DIRECTORY '/'tmp/or_employees
上面的图片替换INTO TABLE us_employees
此致
只是针对这个特定问题的一个想法(不可概括)。在输出表上创建一个分区cnty
,并为分区的路径创建两个外部表:
CREATE TABLE all_employees (
...
)
PARTITIONED BY (cnty string)
...
LOCATION '/...../all_employees;
CREATE EXTERNAL TABLE us_employees (
...
)
LOCATION '/...../all_employess/US/';
CREATE EXTERNAL TABLE ca_employees (
...
)
LOCATION '/...../all_employess/CA/';
然后你只需插入:
INSERT INTO TABLE all_employees PARTITION(cnty)
SELECT *
FROM staged_employees se
WHERE cnty in ('US','CA')
IF...ELSE ...construct,OK,你可以用CASE WHEN来做。您上面的代码等于:
INSERT INTO TABLE us_employees
SELECT *
FROM staged_employees se
WHERE cnty in ('US','CA')