使用 Stack 函数或 Explode Function 来实现蜂巢结果

Use of Stack function or Explode Function to achieve the hive result

Select col1 from staging   returns the following 

"a, b,u,y"

"c, d"

e

f

我想要下面的结果(去掉双引号,用逗号分隔单个记录,然后堆叠它们)

a
b
u
y
c
d
e
f

我尝试实现的方法是

select distinct(regexp_replace(col1,'"','')) 来自分期

这将负责删除双引号。

我认为这是应该的,但缺少一些东西..

select distinct(explode(split(col1,",")))  from staging

我正在尝试的是通过提供 , 作为拆分器来拆分列值,这将 return 一个数组。之后,使用explode将数组拆分为Rows。

我确定提到逗号的 RegX 不正确...

我认为这就是您要实现的目标:

SELECT DISTINCT col1
FROM (
  SELECT
    explode(split(regexp_replace(col1, "\s|\"", ''), ',')) AS col1
  FROM staging
) t;

DISTINCT 似乎在 Hive 中作为 UDTF 隐式实现,并且在表达式 (explode 是一个 UDTF).

这是此查询return使用您发布的示例数据生成的内容:

hive> DESCRIBE staging;
OK
col1                        string                              
Time taken: 0.295 seconds, Fetched: 1 row(s)
hive> SELECT * FROM staging;
OK
"a, b,u,y"
"c, d"
e
f
Time taken: 0.208 seconds, Fetched: 4 row(s)
hive> SELECT DISTINCT col1
    > FROM (
    >   SELECT
    >     explode(split(regexp_replace(col1, "\s|\"", ''), ',')) AS col1
    >   FROM staging
    > ) t;
...
... Lots of MapReduce-related spam
...
a
b
c
d
e
f
u
y
Time taken: 19.787 seconds, Fetched: 8 row(s)

如果您不想或不需要 DISTINCT(如您所见,它会隐式对结果进行词法排序),那么您可以只使用查询的内部部分:

SELECT
  explode(split(regexp_replace(col1, "\s|\"", ''), ',')) AS col1
FROM staging;

然后 return 会是这样的:

a
b
u
y
c
d
e
f
Time taken: 14.479 seconds, Fetched: 8 row(s)