5

我在 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

4 回答 4

1

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表中读取所有数据两次。并且,可能会使集群的其他用户非常恼火。

于 2013-01-23T00:38:34.473 回答
0

尽管这是一个老问题,但下图可能对 Edward Capriolo、Dean Wampler 和 Jason Rutherglen 的 Programming Hive 一书有所帮助,第5第 76 页

用于编写多个插入语句的 hive 命令片段

OVERWRITE DIRECTORY '/'tmp/or_employees上面的图片替换INTO TABLE us_employees

此致

于 2020-10-13T18:28:39.460 回答
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')
于 2020-08-10T15:11:01.243 回答
-1

IF...ELSE ...construct,OK,你可以用CASE WHEN来做。您上面的代码等于:

INSERT INTO TABLE us_employees
SELECT * 
FROM staged_employees se
WHERE cnty in ('US','CA')
于 2017-05-27T08:27:59.327 回答