当前位置: 首页 > news >正文

hive的几种复杂数据类型

Hive的几种复杂数据类型

Hive 提供了几种复杂数据类型,能够支持更灵活和多样的数据存储。这些复杂数据类型对于处理嵌套数据或不规则数据特别有用。主要包括以下几种:


在这里插入图片描述

文章目录

  • Hive的几种复杂数据类型
    • 1. 数组(ARRAY)
    • 2. 结构体(STRUCT)
    • 3.映射(MAP)
    • 4. 联合类型(UNIONTYPE)
    • 5. 复杂数据类型的嵌套使用
    • 综合案列
    • hive复杂数据类型运用场景总结


1. 数组(ARRAY)

数组类型用于存储同一数据类型的多个元素。数组中的元素是有序的,可以通过索引访问。

ARRAY<type>

示例
假设我们有一个存储学生信息的表,每个学生可以有多个考试成绩我们,可以为数组类型列添加注释,说明数组的用途和存储的元素类型。


CREATE TABLE student_scores (student_id INT COMMENT '学生的唯一标识符',student_name STRING COMMENT '学生的姓名',scores ARRAY<INT> COMMENT '学生的考试成绩,包含多个成绩值'
);
---插入 
INSERT INTO student_scores VALUES (1, 'Alice', ARRAY(90, 85, 88));
INSERT INTO student_scores VALUES (2, 'Bob', ARRAY(78, 82, 75));---查询
SELECT student_name, scores FROM student_scores;
---访问数组元素
SELECT student_name, scores[0] FROM student_scores;获取第一个成绩

2. 结构体(STRUCT)

结构体类型用于存储一组不同类型的字段。可以将多个不同类型的数据组合在一个字段中。

STRUCT<field1:type1, field2:type2, ...>

假设我们有一个包含员工信息的表,每个员工有多个字段,如姓名、薪资和入职日期:

CREATE TABLE employees (emp_id INT COMMENT '员工的唯一标识符',emp_info STRUCT<name:STRING, salary:FLOAT, join_date:DATE> COMMENT '包含员工的姓名、薪资和入职日期的结构体'-- 结构体字段的注释:-- name: 员工的姓名-- salary: 员工的薪资-- join_date: 员工的入职日期
);---插入
INSERT INTO employees VALUES (1, STRUCT('John Doe', 75000.50, '2020-01-01'));---查询
SELECT emp_info.name, emp_info.salary FROM employees;

3.映射(MAP)

映射类型用于存储键值对(key-value pairs)。键和值可以是不同的数据类型。这个类型特别适合存储类似字典或哈希表的数据。

语法

MAP<key_type, value_type>

示例
假设我们有一个表来存储员工的多个联系方式,其中每个联系方式都由一个键(如电话、电子邮件)和一个值(如电话号码、电子邮件地址)组成:

CREATE TABLE employee_contacts (emp_id INT COMMENT '员工的唯一标识符',contact_info MAP<STRING, STRING> COMMENT '员工的联系方式,包含多个键值对(例如,电话和电子邮件)'-- 映射字段的注释:-- 键:表示联系信息的类型,如'phone'或'email'-- 值:对应的联系信息,如电话号码或电子邮件地址
);
---插入数据
INSERT INTO employee_contacts VALUES (1, MAP('phone'='123-456-7890', 'email'='john.doe@example.com'));
---查询数据
SELECT emp_id, contact_info['phone'] FROM employee_contacts;  -- 查询电话号码SELECT emp_id, contact_info['phone'] AS phone_number, contact_info['email'] AS email_address 
FROM employee_contacts;

4. 联合类型(UNIONTYPE)

联合类型允许字段存储不同类型的数据。它可以存储多种类型的数据,但在同一时刻只能存储其中一种类型的数据。这对于处理复杂的嵌套数据结构非常有用。

语法

UNIONTYPE<type1, type2, ...>

示例
假设我们有一个表来存储某个用户的反馈信息,其中每条反馈可以是文本、整数或布尔值:

CREATE TABLE user_feedback (feedback_id INT COMMENT '反馈的唯一标识符',feedback UNIONTYPE<STRING, INT, BOOLEAN> COMMENT '用户的反馈内容,可以是文本、整数或布尔值'-- 联合类型字段的注释:-- 可以存储不同类型的反馈内容:-- STRING:文本类型反馈,如用户评论-- INT:整数类型反馈,如评分-- BOOLEAN:布尔类型反馈,如是否满意
);
---插入数据
INSERT INTO user_feedback VALUES (1, 'Great service!');
INSERT INTO user_feedback VALUES (2, 5);  -- 整型反馈
INSERT INTO user_feedback VALUES (3, TRUE);  -- 布尔反馈---查询数据
SELECT feedback_id, feedback FROM user_feedback;

5. 复杂数据类型的嵌套使用

Hive 还支持复杂数据类型的嵌套使用,你可以将 ARRAY、STRUCT 和 MAP 结合使用,以构建更加复杂的数据结构。

示例
创建一个表存储课程信息,其中包括课程名称、教师信息(结构体类型)以及学生名单(数组类型):

CREATE TABLE course_info (course_id INT,course_name STRING,teacher_info STRUCT<name:STRING, experience_years:INT>,students ARRAY<STRING>
);INSERT INTO course_info VALUES (101, 'Big Data Analytics',STRUCT('Dr. Smith', 10), ARRAY('Alice', 'Bob', 'Charlie')
);SELECT course_name, teacher_info.name, students FROM course_info;---查询 
---通过 EXPLODE 函数将数组展开,每一行显示一个学生:
SELECT course_name, teacher_info.name AS teacher_name, student 
FROM course_info 
LATERAL VIEW EXPLODE(students) AS student;
---course_name:每一行显示课程名称(在本例中为 'Big Data Analytics')。
---teacher_info.name:每一行显示教师的姓名(在本例中为 'Dr. Smith')。
---student:每一行显示 students 数组中的一个学生。

综合案列

我们将创建一个名为 employee_data 的表,包含以下字段:
id:员工 ID(INT 类型,基本类型)
name:员工姓名(STRING 类型,基本类型)
salary:员工工资(DOUBLE 类型,基本类型)
skills:员工的技能(ARRAY 类型,复杂类型)
address:员工地址(STRUCT<street: STRING, city: STRING, zip: INT> 类型,复杂类型)
projects:员工参与的项目(MAP<STRING, STRING> 类型,复杂类型)

CREATE TABLE employee_data (id INT,name STRING,salary DOUBLE,skills ARRAY<STRING>,address STRUCT<street: STRING, city: STRING, zip: INT>,projects MAP<STRING, STRING>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS TERMINATED BY '|'
MAP KEYS TERMINATED BY ':'
STORED AS TEXTFILE;--ROW FORMAT DELIMITED:
--表示行的格式为分隔符格式。这意味着每一行的数据用特定的分隔符分隔。--FIELDS TERMINATED BY ',':
--定义了字段之间的分隔符为逗号 ,。这意味着在数据存储时,每个字段的值用逗号隔开。--COLLECTION ITEMS TERMINATED BY '|':
--定义了数组和映射中的项之间的分隔符为竖线 |。例如,skills 数组中的多个技能会用竖线隔开。--MAP KEYS TERMINATED BY ':':
--定义了映射中键(key)和值(value)之间的分隔符为冒号 :。这意味着在 projects 字段中,项目名称与项目描述之间用冒号隔开。--STORED AS TEXTFILE:
--定义了数据将以文本文件的格式存储。这意味着 Hive 会将表的数据存储为可读的文本文件,这对调试和查看数据非常有用。INSERT INTO TABLE employee_data VALUES(1, 'Alice', 75000.00, ARRAY('Java', 'Python'), NAMED_STRUCT('street', '123 Main St', 'city', 'New York', 'zip', 10001), MAP('Project1', 'Data Warehouse', 'Project2', 'Cloud Migration')),(2, 'Bob', 85000.00, ARRAY('Scala', 'Spark'), NAMED_STRUCT('street', '456 Market St', 'city', 'San Francisco', 'zip', 94105), MAP('Project1', 'Big Data Analytics', 'Project2', 'Machine Learning'));
  1. 查询 STRUCT 结构中的某个字段
    假设我们要查询员工住在 New York 的所有员工。
SELECT * FROM employee_data 
WHERE address.city = 'New York';

解释: 这里我们通过 address.city 来访问 STRUCT 结构中的 city 字段,查找地址中的城市是 New York 的员工。

  1. 查询 MAP<STRING, STRING> 结构中的某个键
    假设我们想查询员工参与了名为 Project1 的项目,并且这个项目的描述是 Data Warehouse。
SELECT * FROM employee_data 
WHERE projects['Project1'] = 'Data Warehouse';

解释: 这里我们通过 projects[‘Project1’] 来访问 MAP 中 Project1 键对应的值,并查找项目描述为 Data Warehouse 的员工。

  1. 查询数组 (ARRAY) 中包含某个值的员工
    假设我们想查询掌握 Java 技能的所有员工。
SELECT * FROM employee_data 
WHERE ARRAY_CONTAINS(skills, 'Java');

解释: ARRAY_CONTAINS 函数用于检查数组 skills 中是否包含 Java,如果包含则返回该员工的信息。

hive复杂数据类型运用场景总结

这些复杂数据类型在 Hive 中非常有用,特别是在处理大数据和半结构化数据时。它们可以帮助存储更复杂的、嵌套的数据结构,使得数据查询更加灵活和高效。

ARRAY:适用于存储同类数据集合。
STRUCT:适用于存储多个字段的组合。
MAP:适用于存储键值对数据。
UNIONTYPE:适用于存储多种类型中的任意一个。


http://www.mrgr.cn/news/89792.html

相关文章:

  • Linux——基础命令1
  • 超详细UE4(虚幻4)第一人称射击(FPS)游戏制作教程
  • 解决.NET程序通过网盘传到Linux和macOS不能运行的问题
  • 3D gaussian splatting 源码剖析与demo验证
  • 抠图神器,全离线使用,支持win和mac
  • day09_kafka高级
  • 深度学习01 神经网络
  • 使用bucardo实现postgresql数据库双主同步
  • 一文速览DeepSeek-R1的本地部署——可联网、可实现本地知识库问答:包括671B满血版和各个蒸馏版的部署
  • 二分查找算法 (典型算法思想)—— OJ例题算法解析思路
  • MFC 学习笔记目录
  • 车型检测7种YOLOV8
  • 订单状态监控实战:基于 SQL 的状态机分析与异常检测
  • 制造业设备状态监控与生产优化实战:基于SQL的序列分析与状态机建模
  • Denavit-Hartenberg DH MDH坐标系
  • 深入解析 COUNT(DISTINCT) OVER(ORDER BY):原理、问题与高效替代方案
  • 芯片AI深度实战:让verilog不再是 AI 的小众语言
  • SQL进阶实战技巧:某芯片工厂设备任务排产调度分析 | 间隙分析技术应用
  • android 音视频系列引导
  • (●ˇ∀ˇ●)思维导图计划~~~
  • 【动态规划】杨表
  • Ollama 使用笔记
  • 傅立叶变换、拉普拉斯变换、Z 变换的联系是什么?为什么要进行这些变换?
  • FPGA自分频产生的时钟如何使用?
  • [实战]Ubuntu使用工具和命令无法ssh,但使用另一台Ubuntu机器可以用命令ssh,非root用户。
  • AI-Talk开发板之替换唤醒词