Hive中的复杂数据类型 - array、map、struct

水善利万物而不争,处众人之所恶,故几于道💦

文章目录

      • 一、简单数据类型(复习)
      • 二、复杂数据类型
        • array(数组)
        • map(集合)
        • struct(结构体)

          一、简单数据类型(复习)

          官方数据类型详情页

          数据类型描述范围
          tinyint1byte有符号整数from -128 to 127
          smallint2byte有符号整数from -32,768 to 32,767
          int4byte有符号整数from -2,147,483,648 to 2,147,483,647
          bigint8byte有符号整数 from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
          float4byte单精度浮点数\
          double8byte双精度浮点数\
          decimal高精度数值类型decimal(10,0)默认值,表示最多有10位数,其中0位小数
          boolean布尔类型true或者false
          string字符串用的最多
          date日期类型YYYY-­MM-­DD
          timestamp时间戳类型\

          二、复杂数据类型

          array(数组)

          定义数组:array

          构建数组:array(1,3,5,6)

          访问数组:字段名[0]

          map(集合)

          定义集合:map

          构建集合:map(“age”,11,“weight”,99)

          访问集合:字段名[“weight”]

          struct(结构体)

          定义结构体:struct

          构建结构体:named_struct(“name”,“Asrid”,“age”,99)

          访问结构体:字段名.name


          看完上面可能一脸懵,有点懂,又有点迷,下面用一个例子解释下。

          数据类型无非就是创建表的时候指定数据类型,然后向表中插入数据的时候要按照相应的数据类型构建出相应格式类型的数据才能插入,最终在查询的时候如何访问到数据。

          上面说的分别就对应数据类型的定义、构建、访问。

          比如,想创建一张data_type表,字段的数据类型分别用array、map、struct,那如何写呢?

          create table data_type(
          	name string,
          	age int,
          	address map,
          	friend struct,
          	phone array)
          

          表中最后三个字段的类型就是复杂数据类型的定义,也就是如何声明一个复杂的数据类型。


          表创建好了以后,如何向表中插入数据呢?这就涉及到如何构建一个map、array、struct 了

          insert into table data_type
          (name,age,address,friend,phone) values
          ("Bersd",
          32,
          map("山西","太原","陕西","西安"),
          named_struct("name","aaa","age",33),
          array(12345678888,18234567777,19243219998))
          

          构建map的时候,直接map()括号里面写上key value 中间用逗号分割开就行

          构建struct的时候,使用named_struct()括号里面写属性名,属性值,之间用逗号隔开

          构建array的时候,直接array()括号里面写上数组内元素就行了,各个元素之间用逗号隔开


          向表中插入数据之后,那怎样访问到struct、map、array 里面的数据呢?

          select name,
                   address["山西"] shanxi,
                   friend.name friend_name,
                   friend.age friend_age,
                   phone[0] phone_first
          from data_type;
          

          可以看到,访问array和map的时候都是方括号,然后里面写数组下标或者map的key,而访问struct的数据时要.属性名这样子访问

          扩展:以上复杂数据类型之间支持嵌套,也就是说struct里面的数据类型可以写map、array,array里面也可以放map、struct…

          构建struct还可以直接struct(“name”,“张三”,“age”,89)这样他就会给四个默认的列名,这个一般不用