• 2023.11.14 hivesql的容器,数组与映射


     

    目录

    https://blog.csdn.net/m0_49956154/article/details/134365327?spm=1001.2014.3001.5501https://blog.csdn.net/m0_49956154/article/details/134365327?spm=1001.2014.3001.5501

    8.hive的复杂类型

    9.array类型: 又叫数组类型,存储同类型的单数据的集合

     10.struct类型: 又叫结构类型,可以存储不同类型单数据的集合

     11.map类型: 又叫映射类型,存储键值对数据的映射(根据key找value)


    把之前的内容单独拿出来

    https://blog.csdn.net/m0_49956154/article/details/134365327?spm=1001.2014.3001.5501icon-default.png?t=N7T8https://blog.csdn.net/m0_49956154/article/details/134365327?spm=1001.2014.3001.5501

    8.hive的复杂类型

    ---------------------------复杂类型建表格式------------------------
    -- 复杂类型建表格式:
            [row format delimited] # hive的serde机制
            [fields terminated by '字段分隔符'] # 自定义字段分隔符固定格式
            [collection ITEMS terminated by '集合分隔符'] # 自定义array同类型集合和struct不同类型集合
            [map KEYS terminated by '键值对分隔符'] # 自定义map映射kv类型
            [lines terminated by '\n'] # # 默认即可
            hive复杂类型:   array  struct  map

    9.array类型: 又叫数组类型,存储同类型的单数据的集合

    -- array类型: 又叫数组类型,存储同类型的单数据的集合
    --      建表指定类型:  array<数据类型>
    --      取值: 字段名[索引]   注意: 索引从0开始
    --      获取长度: size(字段名)
    --      判断是否包含某个数据: array_contains(字段名,某数据)

     需求: 已知data_for_array_type.txt文件,存储了学生以及居住过的城市信息,要求建hive表把对应的数据存储起

    1.创建表

     [collection ITEMS terminated by '集合分隔符'] # 自定义array同类型集合和struct不同类型集合

    1. ----建表,
    2. create table test_array_1(
    3. name string,
    4. location array<string>
    5. )row format delimited
    6. fields terminated by '\t'
    7. collection items terminated by ',';

    2.加载数据

    1. load data inpath '/itcast/data_for_array_type.txt' into table test_array_1;

     3.验证数据

    4.需求:查询张三是否在天津住过?

     
    
    1. select array_contains(location,'tianjin')from test_array_1 where name = 'zhangsan';

    2. --结果:true

    5. 需求:查询张三的地址有几个?

     
    
    1. select size(location)from test_array_1 where name = 'zhangsan';

    2. --结果:4

    6.需求:查询王五的第二个地址?

     
    
    1. select location[1] from test_array_1 where name = 'wangwu';

    2. --结果:chengdu

     10.struct类型: 又叫结构类型,可以存储不同类型单数据的集合

    --   建表指定类型: struct<子字段名1:数据类型1, 子字段名2:数据类型2 , ...>
    --      取值: 字段名.子字段名n

     [collection ITEMS terminated by '集合分隔符'] # 自定义array同类型集合和struct不同类型集合

    1.建表

    1. -- 建表
    2. create table test_struct_1(
    3. id int,
    4. name_info struct<name:string,age:int>
    5. )row format delimited fields terminated by '#'
    6. collection items terminated by ':';

    2.加载数据

    load data inpath '/itcast/data_for_struct_type.txt' into table test_struct_1;

    3.验证数据

    select * from test_struct_1;

    需求1:查询所有用户姓名

    select name_info.name from test_struct_1;

    需求2:查询所有的用户年龄

    select name_info.age from test_struct_1;

    需求3:查询所有用户的平均年龄

     11.map类型: 又叫映射类型,存储键值对数据的映射(根据key找value)

    --  建表指定类型: map
    --     取值: 字段名[key]
    --     获取长度: size(字段名)
    --     获取所有key: map_keys()
    --     获取所有value: map_values()
    

    1.创建表

    1. --创建表
    2. create table test_map_1(
    3. id int,
    4. name string,
    5. members map<string,string>,
    6. age int
    7. )row format delimited
    8. fields terminated by ','
    9. collection items terminated by '#'
    10. map keys terminated by ':';

    2.加载数据

    load data inpath '/itcast/data_for_map_type.txt'into table test_map_1;

    3.验证数据

    1. --验证数据
    2. select * from test_map_1;
    3. -- 1,林杰均,"{""father"":""林大明"",""mother"":""小甜甜"",""brother"":""小甜""}",28
    4. -- 2,周杰伦,"{""father"":""马小云"",""mother"":""黄大奕"",""brother"":""小天""}",22
    5. -- 3,王葱,"{""father"":""王林"",""mother"":""如花"",""sister"":""潇潇""}",29
    6. -- 4,马大云,"{""father"":""周街轮"",""mother"":""美美""}",26

     需求1:查询每个学生的家庭成员关系(就是所有的key)

    select name,map_keys(members) from test_map_1;

    需求2:查询每个学生的家庭成员姓名(就是所有的value)

    select name ,map_values(members) from test_map_1;

    需求3:查询每个学生和对应的父亲名字

    select name,members['father'] as father from test_map_1;

    需求4:查询马大云是否有兄弟

    select name,array_contains(map_keys(members),'brother') from test_map_1 where name ='马大云';

    -- 需求5:查询每个学生的对应brother姓名,没有brother的学生null补全
    
    -- 需求6:查询每个学生的对应brother姓名,没有brother的学生直接不显示
  • 相关阅读:
    动态规划最长公共子序列(LCS)问题(Java实现)
    MT2096 数列分段
    【小游戏】2D游戏炸弹超人BombSuperman(无限关卡模式)
    一天一个javascript小技巧【可选链操作符】
    Bootloader程序刷写
    VMware Workstation安装ESXi和vCenter(8.0)
    软件过程定义与改进
    三分法,伟大无比的二分法扩展,本节带部分数论问题。
    java基础10题
    uni-app本地存储
  • 原文地址:https://blog.csdn.net/m0_49956154/article/details/134429755