Hive中的多插入语句

时间:2013-01-22 19:10:43

标签: hadoop hive

我遇到了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 ...构造?

4 个答案:

答案 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

最好的问候