【问题标题】:Is there a function equivalent to Hive's 'explode' function in Apache Impala?Apache Impala 中是否有与 Hive 的“爆炸”功能等效的功能?
【发布时间】:2018-05-06 07:49:51
【问题描述】:

Hive 的函数 explode 是 documented here 它本质上是一个非常实用的函数,可以从单个行生成许多行。它的基本版本采用一列,其值是一个值数组,并为每个值生成同一行的副本。

我想知道 Impala 中是否存在这样的事情。我没能在文档中找到它。

【问题讨论】:

标签: hive explode impala sql-function


【解决方案1】:

Impala 在 hive 中没有像 EXPLODE 这样的函数来读取复杂的数据类型并生成多行。

目前通过 Impala,我们可以使用像 select employee.empid from table1 这样的点表示法读取 Hive 生成​​的表中的复杂数据类型。

Impala 只能从 Parquet 表或分区表中的 Parquet 分区中查询复杂类型列

【讨论】:

    【解决方案2】:

    横向视图。在 CDH 5.5 / Impala 2.3 和更高版本中,Impala 支持使用连接表示法而不是 EXPLODE() 关键字对复杂类型(STRUCT、ARRAY 或 MAP)进行查询。有关 Impala 对复杂类型的支持的详细信息,请参阅复杂类型(仅限 CDH 5.5 或更高版本)。

    https://docs.cloudera.com/documentation/enterprise/5-9-x/topics/impala_langref_unsupported.html

    【讨论】:

      【解决方案3】:

      非常非常棘手的方法:

      with A as (select 'row 1' as key, 'a;b;c' as value
                 union all
                 select 'row 2' as key, 'd;e'   as value
                 union all
                 select 'row 3' as key, 'f'     as value),
           B as (select *, length(value) - length(regexp_replace(value,';','')) + 1 as n from A),
           -- assuming you have at lest as many rows as different values in a single row
           C as (select row_number() over(order by key) as seq, n from B), 
           D as (select seq from C where seq <= (select max(n) from C))
      select key, value, split_part(value,';',seq) as part
        from B
       cross join D
       where seq <= n
       order by key,seq
      

      重要提示:请注意“假设您的行数至少与单行中的不同值一样多”的注释。

      只需运行它并查看结果。

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 2015-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-31
        相关资源
        最近更新 更多