我正在提交一个答案,但这仅在“初始”数据包含列名时才有效,即。数据应该具有某种键值对结构。您现在可以将带有映射结构的输入类型存储在配置单元中并基于键进行查询。我会给你一个例子。
假设您在 hdfs 的“/user/input”位置有一个文件,其数据如下
A B C1=D1:C2=D2:C3=D3:C7=D4
E F C1=H1:C7=H2:C5=H4
在 hive 中执行以下操作:
hive>> create external table my_external_table
(column1 string, column2 string, my_map map<string,string>)
row format delimited
fields terminated by ' '
collection items terminated by ':'
map keys terminated by '='
lines terminated by '\n'
stored as textfile location '/user/input';
hive>> select * from my_external_table;
result>> A B {"C1":"D1","C2":"D2","C3":"D3","C7":"D4"}
E F {"C1":"H1","C7":"H2","C5":"H4"}
现在您可以执行这样的查询
hive >> select map_keys[my_map] from my_external_table;
result >> ["C1","C2","C3","C7"]
hive >> select map_values[my_map] from my_external_table;
result >> ["D1","D2","D3","D4"]
["H1","H2","H3","H4"]
hive >> select "C1",my_map['C1'] from my_external_table;
result >> C1 D1
C1 H1
hive >> select map("C1",my_map['C1']) from my_external_table;
result >> {"C1":"D1"}
{"C1":"H1"}
假设您想使用一些现有的地图键值创建一个新表,请执行以下操作:
hive >> create table my_new_table as select map('C1',my_map['C1'],'C2',my_map['C2']) from my_external_table;
hive >> select * from my_new_table;
result >> {"C1":"D1","C2":"D2"}
{"C1":"H1","C2":null}
因此,使用上述方法,我可以创建新表来存储键名和值名,并对它们执行任何类型的转换,前提是初始数据存储为键值对。
注意:
- 您可以轻松创建一个脚本,该脚本将根据需要将列名添加到您的配置单元查询中。
- 假设您的“初始”数据不包含列名,您可以将数据转换为包含列名。或者,您可以使用自定义映射器将数据作为键值对回显
- 我保留了自己的分隔符,可以根据需要随意更改。
- 您也不需要 column1 和 column2 。我只是保留它是为了向您展示所有数据不必是键值对