我遇到了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 ...构造?
答案 0 :(得分:0)
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
表中读取所有数据两次。而且,可能会让您的群集中的其他用户感到非常恼火。
答案 1 :(得分:0)
IF ... ELSE ...构造,好的,你可以使用CASE WHEN来做。 您上面的代码与此相同:
INSERT INTO TABLE us_employees
SELECT *
FROM staged_employees se
WHERE cnty in ('US','CA')
答案 2 :(得分:0)
只是针对此特定问题的一个想法(不可概括)。通过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')
答案 3 :(得分:0)
尽管是一个老问题,下面的图片可能对 Edward Capriolo,Dean Wampler和Jason Rutherglen的书 Programming Hive 有帮助,第5章,第76页
用于编写多个插入语句的hive命令片段
在上图中用OVERWRITE DIRECTORY '/'tmp/or_employees
代替INTO TABLE us_employees
最好的问候