如何在Hive中创建一个表,其数据类型为array <map <string,string =“”>&gt;

时间:2015-06-10 00:07:01

标签: arrays dictionary hive

我正在尝试创建一个具有复杂数据类型的表。数据类型如下所示。

  1. 阵列

  2. 地图

  3. 阵列&LT;地图&lt;字符串,字符串&GT; &GT;

  4. 我正在尝试创建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>>

    ,请你帮我找一下DDL应该是什么

3 个答案:

答案 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'