在Impala中,是否可以将MAP中的映射键投影为结果集中的实际列?我正在摄取一个数据集,在该数据集中我们无法提前知道所有可能的属性,因此我们使用map列来获得最大的灵活性。但是,在查询时,我们仍然希望将这些属性作为自己的列拉出。
下面是带有几个唯一键的简化示例(实际上,我们的数据集中有数百个键)
架构:
Column | Type
-------------------
name | STRING
props | MAP<string, string>
原始表:
Name | Props
-----------------
Bob | {"age": "39", "fav_color": "green"}
Alice | {"fav_animal": "dog", "fav_color": "blue"}
所需结果:
name | age | fav_color | fav_animal
----------------------------------------------
Bob | 39 | green | NULL
Alice | NULL | blue | dog
我可以通过面向行的方式获得所有结果
从table,table.props props中选择名称,props.key,props.value。
但是,我还无法弄清楚如何将那些来自MAP type列的键变成自己的列。在Impala中有有效的方法吗?
(我愿意编写自定义UDF,但是Impala UDF无法接受MAP等复杂类型:(不幸的是)
最佳答案
我能够使用Impala(CDH 5.13)中的struct数据类型实现此目的。以下是我遵循的一组步骤。请注意,Impala仅支持 Parquet 格式的struct数据类型。因此,我使用Hive创建表并将数据加载到表中,并使用Impala对其进行查询。
hive
create table raw_table_parq (
name string,
details struct < age: STRING, fav_color: STRING, fav_animal: STRING >
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '$'
STORED AS PARQUET;
testfile.csv
'Bob',39$'green'$''
'Alice',''$'blue'$'dog'
首先创建了一个基于文本文件的登台表,将csv加载到登台表中,然后使用“插入到”将表加载到 Parquet 表中。数据加载到所需表后,在Impala中使用以下查询:
[quickstart.cloudera:21000] > select name, details.age, details.fav_color, details.fav_animal from test.raw_table_parq;
Query submitted at: 2019-12-30 06:31:09 (Coordinator: http://quickstart.cloudera:25000)
Query progress can be monitored at: http://quickstart.cloudera:25000/query_plan?query_id=2f436ff7e3301734:f6f0a75700000000
+---------+-------------+-------------------+--------------------+
| name | details.age | details.fav_color | details.fav_animal |
+---------+-------------+-------------------+--------------------+
| 'Bob' | 39 | 'green' | '' |
| 'Alice' | '' | 'blue' | 'dog' |
+---------+-------------+-------------------+--------------------+
Fetched 2 row(s) in 0.13s
希望这可以帮助。
关于hadoop - Apache Impala:项目map <string,string>键作为单独的列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59522205/