将其他类型转换为 Impala 数组

Posted

技术标签:

【中文标题】将其他类型转换为 Impala 数组【英文标题】:Convert other types to Impala array 【发布时间】:2018-05-22 17:46:12 【问题描述】:

我有一个程序可以将('A','B') 这样的字符串注入到查询中。如何将其转换为这样的数组横向视图

col
---
 A
 B

Impala vs. Hive 中没有explode(array('A','B')) 函数。我无法将这些值存储在表中,因为它在内存中并动态注入到 SQL 中。

我需要这个的原因是我有另一个表来加入数组中的项目。

谢谢

【问题讨论】:

【参考方案1】:

Impala 只允许选择原始类型作为 select 语句的一部分,以爆炸您的数组(我猜您的表只有一个名为 myarray 的列)您需要执行类似的操作。

演示: 在蜂巢中

create table test_array (myarray array<string>) stored as parquet ; 
-- tricky way to insert values for array 

insert into test_array select  array('a','b') from (select '1') t;
insert into test_array select  array('c','d') from (select '1') t;

黑斑羚

select myarray.item from test_array, test_array.myarray ;

结果

+------+
| item |
+------+
| a    |
| b    |
| c    |
| d    |
+------+

默认情况下,impala 使用名称“item”来访问原始数组的元素。在结构数组的情况下,您需要更改要访问的字段的“项目”。

如果我们添加一个空数组会发生一件有趣的事情

 insert into test_array select  array() from (select '1') t;

如果我们运行相同的查询,您将不会看到空数组作为结果的一部分,这是因为它本质上就像在您的记录和不包括空值的数组之间进行内部连接。如果您想包含带有空数组信息的记录,查询将如下所示

 select myarray.item from test_array LEFT OUTER JOIN  test_array.myarray ;

+------+
| item |
+------+
| c    |
| d    |
| a    |
| b    |
| NULL |
+------+

(你可以找到更多关于不同连接的信息here

【讨论】:

是的,如果我有创建表的方法,我知道这种方法。不幸的是,所有事情都必须发生在一个查询中。 你知道数组或字符串的大小吗?

以上是关于将其他类型转换为 Impala 数组的主要内容,如果未能解决你的问题,请参考以下文章

VB中如何将object类型转换为其他类型?

将具有 AM/PM 的字符串列转换为 Impala 中的时间戳

对象不能从 DBNull 转换为其他类型。

类型转换函数:将其他类型转换为当前类型

Vue JS中把其他类型转换成字符串的三种方法

转换数组类型