我正在尝试创建一个具有复杂数据类型的表。数据类型如下所示。
阵列
地图
阵列<地图<字符串,字符串> >
我正在尝试创建3种类型的数据结构。是否有可能在Hive中创建?我的表DDL如下所示。
create table complexTest(names array<String>,infoMap map<String,String>, deatils array<map<String,String>>)
row format delimited
fields terminated by '/'
collection items terminated by '|'
map keys terminated by '='
lines terminated by '\n';
我的样本数据如下所示。
Abhieet|Test|Complex/Name=abhi|age=31|Sex=male/Name=Test,age=30,Sex=male|Name=Complex,age=30,Sex=female
当我从表中查询数据时,我得到以下值
["Abhieet"," Test"," Complex"] {"Name":"abhi","age":"31","Sex":"male"} [{"Name":null,"Test,age":null,"31,Sex":null,"male":null},{"Name":null,"Complex,age":null,"30,Sex":null,"female":null}]
这不是我所期待的。如果有可能的数据类型array< map < String,String>>
答案 0 :(得分:1)
我不认为使用内置的serde是可能的。如果您事先知道地图中的值是什么,那么我认为更好的方法是将输入数据转换为JSON,然后使用the Hive json serde:
示例数据:
{'Name': ['Abhieet', 'Test', 'Complex'],
'infoMap': {'Sex': 'male', 'Name': 'abhi', 'age': '31'},
'details': [{'Sex': 'male', 'Name': 'Test', 'age': '30'}, {'Sex': 'female', 'Name': 'Complex', 'age': '30'}]
}
表定义代码:
create table complexTest
(
names array<string>,
infomap struct<Name:string,
age:string,
Sex:string>,
details array<struct<Name:string,
age:string,
Sex:string>>
)
row format serde 'org.openx.data.jsonserde.JsonSerDe'
答案 1 :(得分:1)
可以使用以下查询使用结构数组来处理。
create table complexStructArray(custID String,nameValuePairs array<struct< key:String, value:String>>) row format delimited fields terminated by '/' collection items terminated by '|' map keys terminated by '=' lines terminated by '\n';
示例数据:
101 /名称= Madhavan先生|年龄= 30
102 /名称= Ramkumar |年龄= 31
尽管struct允许重复键值与Map不同,但上面的查询应该处理询问数据是否具有唯一键值。
select query将给出如下输出。
蜂房&GT; select * from complexStructArray;
101 [{“key”:“Name”,“value”:“Madhavan”},{“key”:“age”,“value”:“30”}]
102 [{“key”:“Name”,“value”:“Ramkumar”},{“key”:“age”,“value”:“31”}]
答案 2 :(得分:0)
样本数据:{“名称”:[“ Abhieet”,“测试”,“复杂”],“ infoMap”:{“性别”:“男性”,“名称”:“ abhi”,“年龄”: 31},“ details”:[{“ Sex”:“ male”,“ Name”:“ Test”,“ age”:30},{“ Sex”:“ female”,“ Name”:“ Complex”,“年龄”:30}]}
表定义代码:
#hive>
create table complexTest
(names array<string>,infomap struct<Name:string,
age:string,
Sex:string>,details array<struct<Name:string,
age:string,
Sex:string>>)
row format serde 'org.apache.hive.hcatalog.data.JsonSerDe'