Hive 是否保留地图键顺序?

问题描述

我正在使用 Hive Map Type,我想知道 Hive 如何处理键值对顺序?

示例
假设我有下表:

CREATE TABLE db.my_table (col MAP<STRING,INT>)

INSERT INTO db.my_table
SELECT map('A',1,'B',2,'C',3)
UNION ALL
SELECT map('C',4,5,'A',6)

每个 SELECT 语句是否会返回相同顺序的键值对(从我的测试来看,它们总是按原始顺序排列)?

SELECT col FROM db.my_table

{"A":1,"B":2,"C":3}
{"C":4,"B":5,"A":6}

map_values()map_keys() 怎么样(它们似乎也保留了原始顺序)?

SELECT map_values(col),map_keys(col) FROM db.my_table

[1,3] | ["A","B","C"]
[4,6] | ["C","A"]

我也在使用 Brickhouse MapFilterKeysUDF,结果似乎是按键排序的。总是这样吗?

ADD jar hdfs://.../brickhouse-0.6.0.jar;
CREATE TEMPORARY FUNCTION filter_map AS 'brickhouse.udf.collect.MapFilterKeysUDF';

SELECT filter_map(col,array('C','B')) FROM db.my_table

{"B":2,"C":3}
{"B":5,"C":4}

总结
我有 3 个主要问题(但非常感谢更复杂的解释):

  • 是否每个 SELECT 语句都返回 MAP 的原始顺序?
  • map_values()map_keys() 是否遵循相同的约定?
  • Brickhouse MapFilterKeysUDF 结果的顺序是什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)