IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Hive的复杂数据类型与举例 -> 正文阅读

[大数据]Hive的复杂数据类型与举例

Hive的复杂数据类型

array
建表定义:array < string>
取值:arr[0]
如何通过sql构造array:array(),collect_set()

map
建表定义:map <string,int>
取值:map[‘key’]
如何通过sql构造map:map(key1,value1,key2,value2,…),str_to_map(text[,delimiter1,delimiter2])

struct
建表定义:struct < id:int,name:string>
取值:struct.id或者struct.name
如何通过sql构造struct:named_struct()

在这里插入图片描述

该商品维度表的平台属性和销售属性的字段存在多值属性问题,字段类型是复杂数据类型嵌套,即结构体数组。

CREATE EXTERNAL TABLE IF NOT EXISTS dim_sku_full
(
    `id` STRING COMMENT 'sku_id',
    `price` DECIMAL(16,2) COMMENT '商品价格',
    `sku_name` STRING COMMENT '商品名称',
    `sku_desc` STRING COMMENT '商品描述',
    `weight` DECIMAL(16,2) COMMENT '重量',
    `is_sale` BOOLEAN COMMENT '是否在售',
    `spu_id` STRING COMMENT 'spu编号',
    `spu_name` STRING COMMENT 'spu名称',
    `category3_id` STRING COMMENT '三级分类id',
    `category3_name` STRING COMMENT '三级分类名称',
    `category2_id` STRING COMMENT '二级分类id',
    `category2_name` STRING COMMENT '二级分类名称',
    `category1_id` STRING COMMENT '一级分类id',
    `category1_name` STRING COMMENT '一级分类名称',
    `tm_id` STRING COMMENT '品牌id',
    `tm_name` STRING COMMENT '品牌名称',
    `sku_attr_values` ARRAY<STRUCT<attr_id:STRING,value_id:STRING,attr_name:STRING,value_name:STRING>>COMMENT '平台属性',
    `sku_sale_attr_values` ARRAY<STRUCT<sale_attr_id:STRING,sale_attr_value_id:STRING,sale_attr_name:STRING,sale_attr_value_name:STRING>>COMMENT '销售属性',
    `create_time`   STRING COMMENT '创建时间'
)COMMENT '商品维度表'
PARTITIONED BY (`dt` STRING)
STORED AS ORC
LOCATION '/warehouse/gmall/dim/dim_sku_full/'
TBLPROPERTIES ('orc.compress' = 'snappy');

以平台属性为例,得到想要的结构体数组

	SELECT sku_id,
           collect_set(named_struct('attr_id', attr_id, 'value_id', value_id, 'attr_name', attr_name, 'value_name',
                                    value_name)) AS attrs
    FROM ods_sku_attr_value_full
    WHERE dt = '2020-06-14'
    GROUP BY sku_id

该查询结果的每行代表一个sku的一个属性,但一个sku可以有多个属性。根据上述需求,现考虑使用named_struct()转成结构体,使用collect_set()聚合,将一个sku_id的多个struct结构体属性封装到一个结构体数组里。

多值属性问题:维表中的某个属性同时有多个值

解决方法:
第一种:将多值属性放到一个字段,该字段内容为key1:value1,key2:value2的形式。
第二种:将多值属性放到多个字段,每个字段对应一个属性。这种方案只适用于多值属性个数固定的情况。

上述例子为什么没有使用struct()和map(),以及为什么使用array(struct())的原因

未使用struct()原因:结构体字段不好确定,不同商品的平台属性key无法确定。
未使用nap()原因:字段类型设计受到了限制。存储信息较少。

array()数组里有一个一个的结构体struct(),每一个结构体struct()对应一个平台属性,也就是数组里一个元素对应一个属性,一个struct()能够存储更多信息。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-07-04 22:59:49  更:2022-07-04 23:01:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 20:02:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码