尽管impala比hive快得多,但我们使用hive是因为它支持复杂的(嵌套的)数据类型,如数组和Map。
我注意到,从cdh5.5开始,impala现在支持复杂的数据类型。因为在 Impala 中也可以运行hive-udf,所以我们可以在 Impala 中做任何我们想做的事情,但是要快得多。这是个好消息!
当我浏览文档时,我看到impala希望数据以parquet格式存储。我的数据,以其原始形式,恰好是一个两列的csv,其中第一列是一个id,第二列是一个管道分隔的字符串数组,例如:
123,ASDFG|SDFGH|DFGHJ|FGHJK
234,QWERT|WERTY|ERTYU
已创建配置单元表:
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';
原始数据已加载到配置单元表:
LOAD DATA LOCAL INPATH 'raw_data.csv' INTO TABLE id_member_of;
创建了表的Parquet地板版本:
CREATE TABLE `id_member_of_parquet` (
`id` STRING,
`member_of` ARRAY<STRING>)
STORED AS PARQUET;
csv支持的表中的数据被插入到Parquet地板表中:
INSERT INTO id_member_of_parquet SELECT id, member_of FROM id_member_of;
Parquet桌现在可以在Hive中查询:
hive> select * from id_member_of_parquet;
123 ["ASDFG","SDFGH","DFGHJ","FGHJK"]
234 ["QWERT","WERTY","ERTYU"]
奇怪的是,当我在impala中查询同一个 parquet 支持的表时,它没有返回数组列:
[hadoop01:21000] > invalidate metadata;
[hadoop01:21000] > select * from id_member_of_parquet;
+-----+
| id |
+-----+
| 123 |
| 234 |
+-----+
问:数组列怎么了?你能看出我做错了什么吗?
1条答案
按热度按时间bfhwhh0e1#
结果非常简单:我们可以通过将数组添加到
FROM
带点的,例如。