繁体   English   中英

逗号分隔的字符串到各个行 - Impala SQL

[英]Comma delimited string to individual rows - Impala SQL

假设我们有一张桌子:

Owner   | Pets
------------------------------
Jack    | "dog, cat, crocodile" 
Mary    | "bear, pig"

我想得到结果:

Owner   | Pets
------------------------------
Jack    | "dog"
Jack    | "cat"
Jack    | "crocodile" 
Mary    | "bear"
Mary    | "pig"

我通过谷歌搜索找到了一些类似问题的解决方案,但 Impala SQL 不提供任何这些功能来应用建议的解决方案。

任何帮助将不胜感激!

以下适用于 Impala:

split_part(string source, string delimiter, bigint n)

您可以在此处找到文档:

https://www.cloudera.com/documentation/enterprise/5-9-x/topics/impala_string_functions.html

您必须使用 Hive SQL 执行此操作。

所以让我们创建 impala 表

-- imapla sql
CREATE TABLE IF NOT EXISTS tmp.my_example (
  `Owner` VARCHAR,
  Pets VARCHAR
);

INSERT INTO tmp.my_example (`Owner`, `Pets`) VALUES
('Jack', 'dog, cat, crocodile'),
('Mary', 'bear, pig');

然后使用 hive sql 将列拆分为行:

-- hive sql
select f.owner as owner, t1.pos as pos, t1.val AS pet
from tmp.my_example f
lateral view posexplode(split(pets,', ')) t1 

如果您将结果保存为新表,请不要忘记在 impala 中运行refresh new_table以便可以使用您的新表

PS Hive 对于这个小表来说速度慢得令人难以置信,但对于真实数据来说却是合理的

在 Impala 中试试这个:

    select t,split_part(t,',',RT) cc
    from (
    select '12,33,4' t
    union all 
    select '12,23'   t
    ) T1
    inner join(
    select row_number() over(partition by 1 order by 1 ) RT
    from test.any_table_name limit 10) T2
    where T2.RT<=length(t) - length(replace(t,',','')) +1
    order by t,RT

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM