hive的几种复杂数据类型

news2025/3/18 20:50:46

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.coloradmin.cn/o/2296636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

序列化/反序列化与TCP通信协议

深入理解序列化/反序列化与TCP通信协议 一、序列化与反序列化 1.1 基本概念 序列化&#xff08;Serialization&#xff09;: 将数据结构或对象状态转换为可存储/传输格式的过程反序列化&#xff08;Deserialization&#xff09;: 将序列化后的数据恢复为原始数据结构的过程 …

Ollama 本地部署 体验 deepseek

下载安装ollama,选择模型 进行部署 # 管理员命令行 执行 ollama run deepseek-r1:70b浏览器访问http://ip:11434/ 返回 Ollama is runninghttp://ip:11434/v1/models 返回当前部署的模型数据 下载安装CherryStudio&#xff0c;本地对话UI 客户端 在设置中 修改API地址&#x…

Linux探秘坊-------4.进度条小程序

1.缓冲区 #include <stdio.h> int main() {printf("hello bite!");sleep(2);return 0; }执行此代码后&#xff0c;会 先停顿两秒&#xff0c;再打印出hello bite&#xff0c;但是明明打印在sleep前面&#xff0c;为什么会后打印呢&#xff1f; 因为&#xff…

postgreSQL16.6源码安装

1.获取源码 从PostgreSQL: File Browser获取tar.bz2或者tar.gz源码 2.解压 tar xf postgresql-version.tar.bz2 roothwz-VMware-Virtual-Platform:/usr/local# tar xf postgresql-16.6.tar.bz2 roothwz-VMware-Virtual-Platform:/usr/local# ll 总计 24324 drwxr-xr-x 12 ro…

树莓派上 基于Opencv 实现人脸检测与人脸识别

一&#xff0c;需求 基于树莓派4b&#xff0c;usb1080p摄像头&#xff0c;实现人脸检测与人脸识别。尝试了海陵科的模组和百度的sdk。海陵科的模组无法录入人脸&#xff0c;浪费了100多块钱。百度的sdk 在树莓派上也无法录入人脸&#xff0c;官方解决不了。最后只能用opencv自…

mac下dify+deepseek部署,实现私人知识库

目前deepseek 十分火爆&#xff0c;本地部署实现私有知识库&#xff0c;帮助自己日常工作&#xff0c;上一篇使用工具cherry studio可以做到私人知识库。今天学习了一下&#xff0c;使用Dify链接deepseek&#xff0c;实现私人知识库&#xff0c;也非常不错&#xff0c;这里分享…

CSS 实现下拉菜单效果实例解析

1. 引言 在 Web 开发过程中&#xff0c;下拉菜单是一种常见且十分实用的交互组件。很多前端教程都提供过简单的下拉菜单示例&#xff0c;本文将以一个简洁的实例为出发点&#xff0c;从 HTML 结构、CSS 样式以及整体交互逻辑三个层面进行详细解析&#xff0c;帮助大家理解纯 C…

x64、aarch64、arm与RISC-V64:详解四种处理器架构

x64、aarch64、arm与RISC-V64:详解四种处理器架构 x64架构aarch64架构ARM架构RISC-V64架构总结与展望在计算机科学领域,处理器架构是构建计算机系统的基石,它决定了计算机如何执行指令、管理内存和处理数据。x64、aarch64、arm与RISC-V64是当前主流的四种处理器架构,它们在…

Java使用aspose实现pdf转word

Java使用aspose实现pdf转word 一、下载aspose-pdf-21.6.jar包【下载地址】&#xff0c;存放目录结构如图&#xff1b;配置pom.xml。 <!--pdf to word--> <dependency><groupId>com.aspose</groupId><artifactId>aspose-pdf</artifactId>…

国产编辑器EverEdit - 迷你查找

1 迷你查找 1.1 应用场景 某些场景下&#xff0c;用户不希望调出复杂的查找对话框&#xff0c;此时可以使用迷你查找窗口。 1.2 使用方法 选择主菜单查找 -> 迷你查找&#xff0c;或使用快捷键Ctrl Alt F&#xff0c;会在右上角弹出迷你查找窗口&#xff0c;如下图所示…

嵌入式音视频开发(一)ffmpeg框架及内核解析

系列文章目录 嵌入式音视频开发&#xff08;零&#xff09;移植ffmpeg及推流测试 嵌入式音视频开发&#xff08;一&#xff09;ffmpeg框架及内核解析 文章目录 系列文章目录前言一、ffmpeg的内核1.1 框架解析1.2 内核解析1.3 FFmpeg内部数据流1.3.1 典型的解码流程1.3.2 典型的…

javaEE-11.javaScript入门

目录 一.什么是javaScript 二.快速实现 三.JS引入方式 1.行内引入: 2.内部引入: 3.外部引入: 四.基础语法 1.变量 变量命名规则: 2.数据类型 3.运算符 五.JS对象 1.数组 创建数组: 2.操作数组 3.函数 函数注意事项: 函数参数: 4.对象 1.使用字面量 创建对象:…

畅游Diffusion数字人(16):由音乐驱动跳舞视频生成

畅游Diffusion数字人(0):专栏文章导航 前言:从Pose到跳舞视频生成的工作非常多,但是还没有直接从音乐驱动生成的工作。最近字节跳动提出了MuseDance,无需复杂的动作引导输入(如姿势或深度序列),从而使不同专业水平的用户都能轻松进行灵活且富有创意的视频生成。 目录 贡…

DeepSeek 助力 Vue 开发:打造丝滑的步骤条

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

领略算法真谛:差分

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…

【图片转换PDF】多个文件夹里图片逐个批量转换成多个pdf软件,子文件夹单独合并转换,子文件夹单独批量转换,基于Py的解决方案

建筑设计公司在项目执行过程中&#xff0c;会产生大量的设计图纸、效果图、实景照片等图片资料。这些资料按照项目名称、阶段、专业等维度存放在多个文件夹和子文件夹中。 操作需求&#xff1a;为了方便内部管理和向客户交付完整的设计方案&#xff0c;公司需要将每个项目文件…

在Linux上如何让ollama在GPU上运行模型

之前一直在 Mac 上使用 ollama 所以没注意&#xff0c;最近在 Ubuntu 上运行发现一直在 CPU 上跑。我一开始以为是超显存了&#xff0c;因为 Mac 上如果超内存的话&#xff0c;那么就只用 CPU&#xff0c;但是我发现 Llama3.2 3B 只占用 3GB&#xff0c;这远没有超。看了一下命…

程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<8>

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。 今天我们复习前面学习的指针知识 目录 关于指针数组和数组指针的区别指针数组&#xff08;Array of Poi…

快速集成DeepSeek到项目

DeepSeek API-KEY 获取 登录DeekSeek 官网&#xff0c;进入API 开放平台 2. 创建API-KEY 复制API-KEY进行保存&#xff0c;后期API调用使用 项目中集成DeepSeek 这里只展示部分核心代码&#xff0c;具体请查看源码orange-ai-deepseek-biz-starter Slf4j AllArgsConstructo…

DeepSeek做赛车游戏

赛车模型 2D生成图片 任意AI图片软件SD&#xff0c;MJ 图片生成3D模型 车身 车轮 场景 Rodin,Tripo和Meshy 询问deepSeek如何开发 拷贝代码 将汽车运行代码拖到汽车上 再让AI写个摄像头跟随代码 再去提问deepseek控制轮胎和一些处理细节