Hive 中的多插入语句

问题描述 投票:0回答:4

我在 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 ... 结构?

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


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')

0
投票

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

用于编写多个

INSERT
语句的 hive 命令片段:

将上图中的

OVERWRITE DIRECTORY '/'tmp/or_employees
替换为
INTO TABLE us_employees


-1
投票

IF...ELSE ...构造,好的,可以使用CASE WHEN 来完成。 您上面的代码等于:

INSERT INTO TABLE us_employees
SELECT * 
FROM staged_employees se
WHERE cnty in ('US','CA')
© www.soinside.com 2019 - 2024. All rights reserved.