程序笔记   发布时间:2022-07-19  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Hive 表复杂类型字段使用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

1. Hive中复杂数据类型

  1>. 复杂类型定义

     1.1 map结构数据定义  map<String,String>    1.2 array结构数据定义  array<String>    1.3 struct结构数据定义  struct<id:int,name:string,age:int>    1.4 struct和array嵌套定义 array<struct<id:int,name:string,age:int>>

  2>. 复杂类型数据封装

     2.1 map类型        map(key1,val1,key2,val2,....)               --使用map函数    2.2 struct类型        struct(val1,val2,val3,..)                   --使用struct构造器函数,对应列名默认是col1,col2,col3,...        named_struct(name1,val1,name2,val2,..)      --使用带名称struct构造器函数,指定对应列名    2.3 array类型        array(val1,val2,val3,...)        collect_list() 函数         collect_set()  函数

  3>. 复杂类型数据访问

    3.1 map        map[key]                                    --获取key对应的value    3.2 struct        struct.columnName                           --columnName代表列名    3.3 array        arraY[index]                                --index表示索引值

2. 具体使用案例

  1>.  数据准备: 创建一个复杂类型的表+简单类型表

create table test.employee(
              name StriNG,
              salary FLOAT,
              subordinates ARRAY<String>,
              deductions MAP<String,String>,
              address ARRAY<STRUCT<stree:string,city:string,state:string,zip:int>>
            ) ROW FORMAT DELIMITED
                  FIELDS TERMINATED BY 't'
                  COLLECTION ITEMS TERMINATED BY ','
                  MAP KEYS TERMINATED BY ':'
            STORED AS TEXTFILE;
        create table test.emp(
              name StriNG,
              salary FLOAT,
              subord String,
              dedkey String,
              dedval FLOAT,
              stree String,
              city String,
              state String,
              zip int
            ) ROW FORMAT DELIMITED
                  FIELDS TERMINATED BY 't'
            STORED AS TEXTFILE;
         insert into test.emp (name,salary,subord,dedkey,dedval,stree,city,state,zip) values ('u001',25000,'sub001','ded-k01',10.01,'china','beijing','use','100000');
         insert into test.emp (name,salary,subord,dedkey,dedval,stree,city,state,zip) values ('u001',25000,'sub002','ded-k02',20.02,'china-02','shanghai','use','100001');
         insert into test.emp (name,salary,subord,dedkey,dedval,stree,city,state,zip) values ('u001',25000,'sub003','ded-k03',30.03,'china-03','lanzhou','use','100002');

  2>.  根据简单类型表数据组装复杂类型表中数据

     1). 使用COllect_list()组装 ARRAY<String>字段
             SELEct name,collect_list(subord) subordinates  from   test.emp  group by name;
                 name    subordinates
                 u001    ["sub002","sub003","sub001"]
        2). 使用COllect_list()组装 ARRAY<STRUCT<stree:string,city:string,state:string,zip:int>>字段
            SELEct name,collect_set(named_struct('stree',stree,'city',city,'state',state,'zip',zip)) address from  test.emp group by name;
                name    address
                u001    [{"stree":"china-02","city":"shanghai","state":"use","zip":100001},{"stree":"china-03","city":"lanzhou","state":"use","zip":100002},{"stree":"china","city":"beijing","state":"use","zip":100000}]

        3). 组装Map类型字段
            SELEct name,collect_set(named_struct('dedkey',dedkey,'dedval',dedval)) page_stats from  test.emp group by name;
                u001    [{"dedkey":"ded-k02","dedval":20.02},{"dedkey":"ded-k03","dedval":30.03},{"dedkey":"ded-k01","dedval":10.01}]

            SELEct name,collect_set(concat_ws('=',dedkey,cast(dedval as String))) page_stats from  test.emp group by name;
                u001    ["ded-k02=20.02","ded-k03=30.03","ded-k01=10.01"]

            --  第一步: 将key-value字段组装成一个字符串,借助于concat_ws
             SELEct name,concat_ws(':',dedkey,cast(dedval as String)) kvs from  test.emp ;
                     name    kvs
                    u001    ded-k03:30.03
                    u001    ded-k01:10.01
                    u001    ded-k02:20.02
            --  第二步: 将所有属于同一个人的数据组合在一起,,借助于collect_set
             SELEct name,collect_set(concat_ws(':',dedkey,cast(dedval as String))) kvs from  test.emp group by name;
                    name    kvs
                    u001    ["ded-k02:20.02","ded-k03:30.03","ded-k01:10.01"]

            --  第三步: 将数组变成一个字符串,借助于concat_ws
             SELEct name,concat_ws(',',collect_set(concat_ws(':',dedkey,cast(dedval as String)))) kvs from  test.emp group by name;
                    name    kvs
                    u001    ded-k02:20.02,ded-k03:30.03,ded-k01:10.01

            --  第四步:将字符串转成map 使用函数str_to_map(text, delimiter1, delimiter2)
                --  text:是字符串
                --  delimiter1:多个键值对之间的分隔符
                --  delimiter2:key和value之间的分隔符
             SELEct name,str_to_map(concat_ws(',',collect_set(concat_ws(':',dedkey,cast(dedval as String)))),",",":") from test.emp group by name;
                map     deductions
                u001    {"ded-k02":"20.02","ded-k03":"30.03","ded-k01":"10.01"}

  3>.  最终插入复杂表的SQL

with deds as (
             SELEct name,str_to_map(concat_ws(',',collect_set(concat_ws(':',dedkey,cast(dedval as String)))),",",":") deductions from test.emp group by name
            ),
            adds  as(
             SELEct name,collect_set(named_struct('stree',stree,'city',city,'state',state,'zip',zip)) address from  test.emp group by name
            ),
            subs as(
                SELEct name,collect_list(subord) subordinates  from   test.emp  group by name
            )
            insert  into table test.employee
            SELEct
                coalesce(adds.name,deds.name,subs.Name) name,
                25000,
                subs.subordinates,
                deds.deductions,
                adds.address
            from deds
            full join adds on deds.name=adds.name
            full join subs on deds.name=subs.name;

  4>.  最终复杂表中数据查询

SELECT * from  test.employee;
  employee.name    employee.salary        employee.subordinates            employee.deductions
   u001                25000            ["sub002","sub003","sub001"]    {"ded-k02":"20.02","ded-k03":"30.03","ded-k01":"10.01"}
  employee.address
  [{"stree":"china-02","city":"shanghai","state":"use","zip":100001},{"stree":"china-03","city":"lanzhou","state":"use","zip":100002},{"stree":"china","city":"beijing","state":"use","zip":100000}]

@H_660_197@Hive 表复杂类型字段使用

 

大佬总结

以上是大佬教程为你收集整理的Hive 表复杂类型字段使用全部内容,希望文章能够帮你解决Hive 表复杂类型字段使用所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。