使用堆栈功能或爆炸功能来实现配置结果

时间:2015-01-23 16:58:09

标签: regex hive

Select col1 from staging   returns the following 

"a, b,u,y"

"c, d"

e

f

我想要以下结果(删除双引号,然后用逗号分隔单个记录,然后堆叠它们)

a
b
u
y
c
d
e
f

我尝试实现这一目标的方式是

从分段中选择不同的(regexp_replace(col1,'"'''))

这将删除双引号。

我认为这应该有效,但有些东西不见了......

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

我尝试的是通过提供将返回数组的拆分器来拆分列值。之后,使用explode将数组拆分为Rows。

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

1 个答案:

答案 0 :(得分:1)

我认为这是你想要实现的目标:

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

DISTINCT似乎在Hive中作为UDTF隐式实现,并且在表达式({{{{{ 1}}是一个UDTF。)

这是此查询与您发布的示例数据一起返回的内容:

explode

如果你不想要或不需要DISTINCT(你可以看到隐式排序结果),那么你可以只使用查询的内部部分:

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)

然后会返回类似的内容:

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