Hive:Hive 复杂数据类型使用方法

1. Hive 复杂数据类型

  • Hive 复杂数据类型包括数组(ARRAY)、映射(MAP)和结构体(STRUCT),具体如下所示:

  • ARRAY
    • ARRAY 类型是由一系列相同数据类型的元素组成,这些元素可以通过下标来访问。
    • 比如:有一个 ARRAY 类型的变量 fruits,它是由 [‘apple’,‘orange’,‘mango’] 组成,那么我们可以通过 fruits[1]来访问元素 orange,因为 ARRAY 类型的下标是从 0 开始的。
  • MAP
    • MAP 包含 key->value 键值对,可以通过 key 来访问元素。
    • 比如:”userlist” 是一个 map 类型,其中 username 是 key,password 是 value;那么我们可以通过 userlist[‘username’] 来得到这个用户对应的 password。
  • STRUCT
    • STRUCT 可以包含不同数据类型的元素。
    • 这些元素可以通过”点语法”的方式来得到所需要的元素,比如 user 是一个 STRUCT 类型,那么可以通过 user.address 得到这个用户的地址。
  • 示例:

      CREATE TABLE student(
      name STRING,
      favors ARRAY<STRING>, 
      scores MAP<STRING, FLOAT>,
      address STRUCT<province:STRING, city:STRING, detail:STRING, zip:INT>
      )
      ROW FORMAT DELIMITED
      FIELDS TERMINATED BY '\t'
      COLLECTION ITEMS TERMINATED BY ';'
      MAP KEYS TERMINATED BY ':';
    
    • 字段说明:
      • 字段 name 是基本类型,favors 是数组类型,可以保存很多爱好,scores 是映射类型,可以保存多个课程的成绩,address 是结构类型,可以存储住址信息;
      • ROW FORMAT DELIMITED 是指明后面的关键词是列和元素分隔符的;
      • FIELDS TERMINATED BY 是字段分隔符;
      • COLLECTION ITEMS TERMINATED BY 是元素分隔符(Array 中的各元素、Struct 中的各元素、Map 中的 key-value 对之间);
      • MAP KEYS TERMINATED BY 是 Map 中 key 与 value 的分隔符;
      • LINES TERMINATED BY 是行之间的分隔符;
      • STORED AS TEXTFILE 指数据文件上传之后保存的格式。
    • 优势
      • 在关系型数据库中,我们至少需要三张表来定义,包括学生地址信息表、爱好表、成绩表;
      • 但在 Hive 中通过一张表就可以搞定了;
      • 也就是说,复合数据类型把多表关系通过一张表就可以实现了。

2. ARRAY

  • 创建表

      create table test.person(name string,work_locations array<string>)
      row format delimited
      fields terminated by ' ';
    
  • 数据内容

      huangbo beijing,shanghai,tianjin,hangzhou
      xuzheng changchu,chengdu,wuhan
      wangbaoqiang dalian,shenyang,jilin
    
  • 加载数据

      load data local inpath '/home/score.txt' into table test.score;
    
  • 查询数据

      select * from test.person;
      select name from test.person;
      select work_locations from test.person;
      select work_locations[0] from test.person;
    

3. MAP

  • 创建表
      create table test.score(name string, scores map<string,int>)
      row format delimited fields terminated by ' '
      collection items terminated by ','
      map keys terminated by ':';
    
  • 数据内容
      huangbo yuwen:80,shuxue:89,yingyu:95
      xuzheng yuwen:70,shuxue:65,yingyu:81
      wangbaoqiang yuwen:75,shuxue:100,yingyu:75
    
  • 加载数据
      load data local inpath '/home/score.txt' into table test.score;
    
  • 查询数据
      select * from test.score;
      select name from test.score;
      select scores from test.score;
      select s.scores['yuwen'] from test.score s;
    

4. STRUCT

  • 创建表
      create table test.structtable(id int,course struct<name:string,score:int>)
      row format delimited fields terminated by ' '
      collection items terminated by ',';
    
  • 数据内容
      1 english,80
      2 math,89
      3 chinese,95
    
  • 加载数据
      load data local inpath '/home/structtable.txt' into table test.structtable;
    
  • 查询数据
      select * from test.structtable;
      select id from test.structtable;
      select course from test.structtable;
      select t.course.name from test.structtable t;
      select t.course.score from test.structtable t;