镶木地板支持的Hive表:在Impala中不可查询的数组列

Ale*_*ord 3 hive impala parquet

尽管Impala比Hive快得多,但我们使用Hive是因为它支持复杂的(嵌套的)数据类型,例如数组和映射。

我注意到,从CDH5.5开始,Impala 现在支持复杂的数据类型。由于也可以在Impala中运行Hive UDF,因此我们可能可以在Impala中完成我们想要的所有事情,但是速度要快得多。这真是个好消息!

在浏览文档时,我发现Impala希望数据以Parquet格式存储。我的数据以原始格式碰巧是一个两列CSV,其中第一列是ID,第二列是用竖线分隔的字符串数组,例如:

123,ASDFG|SDFGH|DFGHJ|FGHJK
234,QWERT|WERTY|ERTYU
Run Code Online (Sandbox Code Playgroud)

配置单元表已创建:

CREATE TABLE `id_member_of`(
  `id` INT, 
  `member_of` ARRAY<STRING>)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ',' 
  COLLECTION ITEMS TERMINATED BY '|' 
  LINES TERMINATED BY '\n' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';
Run Code Online (Sandbox Code Playgroud)

原始数据已加载到Hive表中:

LOAD DATA LOCAL INPATH 'raw_data.csv' INTO TABLE id_member_of;
Run Code Online (Sandbox Code Playgroud)

表的Parquet版本已创建:

CREATE TABLE `id_member_of_parquet` (
 `id` STRING, 
 `member_of` ARRAY<STRING>) 
STORED AS PARQUET;
Run Code Online (Sandbox Code Playgroud)

来自CSV支持表的数据被插入到Parquet表中:

INSERT INTO id_member_of_parquet SELECT id, member_of FROM id_member_of;
Run Code Online (Sandbox Code Playgroud)

现在可以在Hive中查询Parquet表:

hive> select * from id_member_of_parquet;
123 ["ASDFG","SDFGH","DFGHJ","FGHJK"]
234 ["QWERT","WERTY","ERTYU"]
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当我在Impala中查询同一Parquet支持的表时,它不返回数组列:

[hadoop01:21000] > invalidate metadata;
[hadoop01:21000] > select * from id_member_of_parquet;
+-----+
| id  |
+-----+
| 123 |
| 234 |
+-----+
Run Code Online (Sandbox Code Playgroud)

问题:数组列发生了什么?你能看到我做错了吗?

Ale*_*ord 5

事实证明这非常简单:我们可以通过将数组添加到FROM带有点的数组中来访问数组,例如

Query: select * from id_member_of_parquet, id_member_of_parquet.member_of
+-----+-------+
| id  | item  |
+-----+-------+
| 123 | ASDFG |
| 123 | SDFGH |
| 123 | DFGHJ |
| 123 | FGHJK |
| 234 | QWERT |
| 234 | WERTY |
| 234 | ERTYU |
+-----+-------+
Run Code Online (Sandbox Code Playgroud)