【问题标题】:Comma delimited string to individual rows - Impala SQL逗号分隔的字符串到各个行 - Impala SQL
【发布时间】:2016-09-20 19:37:42
【问题描述】:

假设我们有一张桌子:

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

我想得到一个结果:

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

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

任何帮助将不胜感激!

【问题讨论】:

  • 您能否添加一些您尝试过的方法和结果的详细信息,以免人们重复您失败的努力?
  • 你想要做的是“扁平化”一个嵌套的数据结构,而那个嵌套的东西违反了整个实体关系的概念。所以它不能用标准 SQL来完成;仅具有特定于数据库的扩展,这些扩展可能存在也可能不存在,并且在不同数据库之间会有很大差异。抱歉,Impala 不是为这种丑陋的 ETL 设计的;您应该使用 Pig 或 Hive 或其他任何东西准备数据,将其加载到 Hive 表中,然后使用 REFRESH <table_name> 将其公开给 Impala

标签: sql split cloudera impala


【解决方案1】:

您必须使用 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 以便可以使用您的新表

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

【讨论】:

【解决方案2】:

Impala 中的以下工作:

split_part(string source, string delimiter, bigint n)

您可以在此处找到文档:

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

【讨论】:

  • 此解决方案一次仅适用于一个令牌。如果没有对每个索引位置的显式调用,它不会将值干净地扁平化为单独的行。从技术上讲,这可能是一种解决方法,但会非常冗长和混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 2015-03-09
相关资源
最近更新 更多