我在 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
表中读取所有数据两次。并且,有可能让集群中的其他用户感到非常恼火。
只是针对这个特定问题的一个想法(不可概括)。在输出表上按
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')
尽管这是一个老问题,但下图可能会对 Edward Capriolo、Dean Wampler 和 Jason Rutherglen 所著的《Programming Hive》一书有所帮助,第 5 章,第 76 页。
用于编写多个
INSERT
语句的 hive 命令片段:
将上图中的
OVERWRITE DIRECTORY '/'tmp/or_employees
替换为INTO TABLE us_employees
IF...ELSE ...构造,好的,可以使用CASE WHEN 来完成。 您上面的代码等于:
INSERT INTO TABLE us_employees
SELECT *
FROM staged_employees se
WHERE cnty in ('US','CA')