Hive SQL 快速入门指南

在大数据蓬勃发展的当下,处理海量数据成为企业面临的关键挑战。Hive SQL 作为一款强大的工具,为我们打开了高效处理大数据的大门。接下来,让我们一起踏上 Hive SQL 的入门之旅。​

一、Hive SQL 是什么​

Hive 是基于 Hadoop 的数据仓库工具,它允许我们使用类似 SQL 的语法来查询和分析存储在 Hadoop 分布式文件系统(HDFS)中的数据。与传统数据库不同,Hive 将我们编写的 SQL 语句转换为 MapReduce、Tez 或 Spark 任务在 Hadoop 集群上执行,这使得它非常适合处理大规模的离线批量数据。​

Hive 的优势十分显著:​

  1. 兼容性佳:支持标准 SQL 语法,对于熟悉 SQL 的开发者而言,几乎没有学习成本,能轻松上手。​
  1. 扩展性强:依托 Hadoop 集群,可轻松扩展以处理 PB 级别的海量数据,满足企业数据量不断增长的需求。​
  1. 灵活性高:支持多种存储格式,如 TextFile、ORC、Parquet 等,我们可以根据数据特点和业务需求选择最合适的存储方式。​
  1. 生态集成好:能与 Hadoop 生态系统中的其他组件,如 Spark、Pig、Flume 等无缝对接,为大数据处理提供了丰富的技术组合。​

架构解析​

Hive 的架构由多个关键组件构成:​

  1. 元数据存储(Metastore):负责存储数据库、表、分区等元数据信息。默认情况下,Hive 使用 Derby 数据库存储元数据,但在生产环境中,通常推荐使用 MySQL,因为它具有更好的性能和多用户支持能力。​
  2. 执行引擎:Hive 支持多种执行引擎,如 MapReduce、Tez 和 Spark。不同的执行引擎在性能和适用场景上有所差异,我们可以根据实际需求进行选择。例如,MapReduce 是 Hive 最早支持的执行引擎,成熟稳定,但在一些复杂查询场景下性能可能欠佳;Tez 则对 MapReduce 进行了优化,减少了中间数据的磁盘读写,提升了执行效率;Spark 作为内存计算框架,在处理迭代式算法和交互式查询时表现出色。​
  3. 解析器:其作用是将我们编写的 SQL 语句转换为抽象语法树(AST)。这一步骤类似于编译器对代码的词法和语法分析,确保 SQL 语句的语法正确,并为后续的编译和优化做准备。
  4. ​优化器:对逻辑查询计划进行优化,生成更高效的物理查询计划。优化器会考虑多种因素,如数据分布、表的大小、查询条件等,通过重写查询语句、选择合适的连接算法等方式,提升查询的执行效率。​

二、基础语法详解​

数据库操作​

在 Hive 中,数据库就像是一个命名空间,用于组织和管理表。创建数据库时,我们可以指定其存储路径和一些元数据属性。​

1.创建数据库:

CREATE DATABASE IF NOT EXISTS my_database;

这里的IF NOT EXISTS子句是一个贴心的设计,它可以避免在数据库已存在时创建失败报错,确保脚本的稳定性。​

2. 查看数据库详细信息:

DESCRIBE DATABASE my_database;

这条语句能让我们了解数据库的基本信息,如创建时间、所有者等。若想获取更详细的信息,可使用DESCRIBE DATABASE EXTENDED my_database;,它会展示数据库的属性、存储位置等更多细节。​

3. 使用数据库:

USE my_database;

使用USE语句指定当前操作的数据库,后续的表操作等都会在这个数据库下进行。​

4. 删除数据库:

DROP DATABASE IF EXISTS my_database;

同样,IF NOT EXISTS子句用于避免删除不存在的数据库时出错。若数据库不为空,直接使用DROP DATABASE会报错,此时需要使用DROP DATABASE my_database CASCADE;来强制删除数据库及其下的所有表和数据。​

表操作​

  1. 内部表(Managed Table)与外部表(External Table):这两种表在数据管理上有着本质区别。​
  • 创建内部表:
CREATE TABLE my_table (id INT,name STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
  • 在这个例子中,我们创建了一个名为my_table的内部表,它有两个字段id(整数类型)和name(字符串类型)。ROW FORMAT DELIMITED FIELDS TERMINATED BY ','指定了数据行的格式,字段之间以逗号分隔;STORED AS TEXTFILE表示数据以文本文件的形式存储在 HDFS 上。当我们删除内部表时,表的数据和元数据都会被删除。​

  • 创建外部表:
CREATE EXTERNAL TABLE my_external_table (id INT,name STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '/path/to/external/data';
  • 外部表的创建与内部表类似,但多了一个LOCATION参数,用于指定数据在 HDFS 上的实际存储路径。删除外部表时,只会删除表的元数据,数据仍会保留在指定的 HDFS 路径上,这在共享数据或数据需要被其他系统复用的场景中非常有用。​

    2. 分区表与分桶表:这是 Hive 提升查询性能的重要机制。​

  • 创建分区表:
CREATE TABLE sales (product_id INT,amount DECIMAL(10, 2)
)
PARTITIONED BY (sale_date STRING, region STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
  • 上述代码创建了一个按销售日期sale_date和地区region分区的sales表。分区表将数据按分区字段存储在不同的目录下,例如,对于sale_date='2024-01-01', region='North'的数据,可能存储在/user/hive/warehouse/sales/sale_date=2024-01-01/region=North/目录中。当我们查询特定分区的数据时,Hive 只需扫描相关分区的目录,大大减少了数据扫描范围,提升了查询效率。​

  • 创建分桶表:
CREATE TABLE users (user_id INT,username STRING
)
CLUSTERED BY (user_id) INTO 10 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS ORC;
  • 这里创建了一个按user_id分桶的users表,将数据分成 10 个桶。分桶通过哈希函数将数据分散到多个文件中,在进行 JOIN 操作时,如果两个表基于相同的分桶字段进行分桶,且桶数相同,Hive 可以直接在对应的桶之间进行 JOIN,避免了全表扫描和大量数据的 Shuffle 操作,从而显著提升 JOIN 性能。在实际应用中,通常建议采用复合分区(如年 / 月 / 日)加分桶(桶数设置为集群节点数的 2 倍左右)的方式,进一步优化查询性能。​

    3. 修改表结构:随着业务的发展,我们可能需要对已有的表结构进行修改。​

  • 添加列:
ALTER TABLE my_table ADD COLUMNS (new_column INT);
  • 这条语句在my_table表中添加了一个名为new_column的整数类型列。​

  • 修改列名和数据类型:
ALTER TABLE my_table CHANGE COLUMN old_column new_column_name DOUBLE;
  • 该语句将my_table表中的old_column列名修改为new_column_name,并将其数据类型从原来的类型改为DOUBLE。​

  • 重命名表:
ALTER TABLE my_table RENAME TO new_table_name;
  • 通过这条语句,我们可以轻松将my_table重命名为new_table_name。​

    4. 删除表:当某个表不再需要时,可以使用以下语句删除:

DROP TABLE IF EXISTS my_table;
  • IF EXISTS同样用于避免删除不存在的表时出错。​

    数据插入与加载​

    Hive 提供了多种数据导入方式,每种方式在性能和适用场景上各有不同。​

  • 从本地文件系统加载数据:这是一种较为常用且快速的方式。
LOAD DATA LOCAL INPATH '/path/to/local/file.csv' INTO TABLE my_table;

该语句将本地文件系统中的file.csv文件数据加载到 Hive 的my_table表中。数据加载后,源文件会被移动到 Hive 表的数据存储目录下(对于内部表)。如果不想移动源文件,而是复制数据,可以使用COPY FROM LOCAL语法(在某些 Hive 版本中支持)。​

2. 从 HDFS 加载数据:

LOAD DATA INPATH '/path/to/hdfs/file.csv' INTO TABLE my_table;

此方式用于将 HDFS 上指定路径的文件数据加载到my_table表中,数据加载后,源文件同样会被移动到 Hive 表的数据存储目录(内部表情况)。​

3. 从查询结果插入数据:当我们需要根据已有表的查询结果插入到另一个表时,可以使用这种方式。

INSERT INTO TABLE new_table
SELECT column1, column2
FROM old_table
WHERE condition;

上述代码从old_table中查询符合condition条件的column1和column2列数据,并插入到new_table表中。如果new_table是分区表,还可以指定插入到特定分区:

INSERT INTO TABLE new_table PARTITION (partition_column='value')
SELECT column1, column2
FROM old_table
WHERE condition;

动态分区插入:在某些情况下,我们可能不知道具体要插入哪些分区,这时可以使用动态分区插入。

SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;INSERT INTO TABLE new_table PARTITION (partition_column)
SELECT column1, column2, partition_value
FROM old_table
WHERE condition;

这里通过设置两个 Hive 参数开启动态分区功能,hive.exec.dynamic.partition=true表示启用动态分区,hive.exec.dynamic.partition.mode=nonstrict表示非严格模式(在严格模式下,至少需要一个静态分区)。查询结果中的partition_value会根据partition_column自动确定插入到哪个分区。​

查询语句​

查询是我们使用 Hive SQL 的核心操作,通过查询从海量数据中获取有价值的信息。​

基本查询:Hive 的基本查询语法与传统 SQL 类似。

SELECT column1, column2
FROM my_table
WHERE condition
ORDER BY column1 DESC
LIMIT 100;

这条语句从my_table表中选择column1和column2列,筛选出满足condition条件的数据,然后按column1列降序排序,最后只返回前 100 条数据。在编写查询时,有一些性能优化技巧:​

  • 过滤条件前置:尽量将过滤条件写在WHERE子句中,让 Hive 尽早减少数据量,避免后续不必要的数据处理。例如,SELECT * FROM my_table WHERE date='2024-01-01' AND amount > 100;,先根据日期和金额条件过滤数据,再进行其他操作。​
  • 使用列裁剪:避免使用SELECT *,只选择需要的列,减少数据传输和处理开销。比如,只需要id和name列时,应写为SELECT id, name FROM my_table;。​
  • 连接查询:在处理多个相关表的数据时,需要使用连接查询。​
  • 内连接(INNER JOIN):
SELECT a.column1, b.column2
FROM table_a a
INNER JOIN table_b b ON a.common_column = b.common_column;

内连接只返回两个表中满足连接条件的行。例如,table_a和table_b通过common_column列进行连接,只有当table_a和table_b中都存在common_column值相同的行时,才会出现在结果集中。​

  • 左外连接(LEFT OUTER JOIN):
SELECT a.column1, b.column2
FROM table_a a
LEFT OUTER JOIN table_b b ON a.common_column = b.common_column;

左外连接会返回左表(table_a)中的所有行,以及右表(table_b)中满足连接条件的行。如果右表中没有匹配的行,则对应列的值为NULL。​

  • 右外连接(RIGHT OUTER JOIN):
SELECT a.column1, b.column2
FROM table_a a
RIGHT OUTER JOIN table_b b ON a.common_column = b.common_column;

右外连接与左外连接相反,返回右表中的所有行,以及左表中满足连接条件的行,左表中无匹配行时对应列值为NULL。​

  • 全外连接(FULL OUTER JOIN):
SELECT a.column1, b.column2
FROM table_a a
FULL OUTER JOIN table_b b ON a.common_column = b.common_column;

全外连接返回两个表中的所有行,当某表中没有匹配行时,对应列的值为NULL。​

3. 子查询:在查询中嵌套另一个查询,称为子查询。

SELECT column1
FROM my_table
WHERE column2 IN (SELECT column3FROM another_tableWHERE condition
);

这条语句先在another_table表中根据condition条件查询出column3的值,然后在my_table表中筛选出column2值在子查询结果中的行,并返回column1列。​

4. 窗口函数:窗口函数是 Hive SQL 的强大功能之一,适用于排名、累计计算等复杂场景。​

  • 计算用户订单金额排名:
SELECT user_id,order_id,amount,ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY amount DESC) AS rank
FROM order_info;

这里使用ROW_NUMBER()窗口函数,在每个user_id分区内,按amount降序对订单进行排名,生成rank列。​

  • 计算移动平均:
SELECT dt,region,amount,AVG(amount) OVER (PARTITION BY region ORDER BY dt RANGE BETWEEN 7 PRECEDING AND CURRENT ROW) AS rolling_7d_avg
FROM daily_sales;

该语句计算每个地区region按日期dt的 7 天移动平均销售额。AVG(amount) OVER (...)表示在region分区内,按日期顺序,计算当前行及前 7 行的平均销售额。​

常见的窗口函数包括:​

  • 排序函数:ROW_NUMBER()(生成唯一的行号)、RANK()(排名,相同值会占用相同排名,下一个排名会跳过)、DENSE_RANK()(排名,相同值会占用相同排名,下一个排名不跳过)。​
  • 聚合函数:SUM()(求和)、AVG()(求平均)、MIN()(求最小值)、MAX()(求最大值)等在窗口函数中可用于计算指定窗口范围内的聚合结果。​
  • 分析函数:LEAD()(获取下一行的值)、LAG()(获取上一行的值)、FIRST_VALUE()(获取窗口内第一行的值)、LAST_VALUE()(获取窗口内最后一行的值)等,用于在窗口内进行数据的前后分析。​
  • 聚合函数与 GROUP BY:聚合函数用于对一组数据进行统计计算,通常与GROUP BY子句一起使用。
SELECT user_id,COUNT(order_id) AS order_count,SUM(amount) AS total_amount
FROM order_info
GROUP BY user_id;

上述代码按user_id分组,统计每个用户的订单数量order_count和总金额total_amount。

以上就是本次初步的一个Hive使用分享,主要是本人因为一些学习上的需要也是正在开始接触Hive相关内容,接触下来了解到其实就是为了方便SQL语言编程者,所以如果有一定的SQL经验上手会更容易,但整体其实也不是那么复杂,也有可能是我刚开始学的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912385.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912385.shtml

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

相关文章

国内公司把数据湖做成了数据库

在做多年的数据仓库项目,数据湖也在做,但是做完发现,这个不是传统数据库里面的ODS吗? 好多公司做数据湖,就是把数据湖做成了ODS层(贴源数据层),难道真的数据湖就是这样等于ODS吗&am…

Python 数据分析与可视化 Day 6 - 可视化整合报告实战

🎯 今日目标 整合数据分析与可视化结果生成结构化报告用代码自动生成完整的图文分析文档熟悉 Jupyter Notebook / Markdown 图表 报告生成流程 🧩 一、项目背景:学生成绩分析报告 数据来源:students_cleaned.csv(含姓…

服务器、树莓派/香橙派部署HomeAssistant与小爱音箱联动

HomeAssistant功能介绍与多平台部署实战:CentOS服务器、树莓派、香橙派部署及小爱音箱联动控制 一、HomeAssistant简介 HomeAssistant是一款基于Python开发的开源智能家居自动化平台,它最大的特点是高度集成和自定义。通过HomeAssistant,用…

内存泄漏系列专题分析之二十四:内存泄漏测试Camera相机进程内存指标分布report概述

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 内存泄漏系列专题分析之二十四:内存泄漏测试Camera相机进程内存指标分布report概述 目录 一、问题背景 二、:内存泄漏测试Camera相机进程内存指标分布report概述 2.1:Camera领域相机进…

华为堆叠理论及配置

一,堆叠基本概念 1.1交换机角色 主交换机(Master):主交换机负责管理整个堆叠。**堆叠系统中只有一台主交换机。**备交换机(Standby):备交换机是主交换机的备份交换机。堆叠系统中只有一台备交换…

【数字经济】数据即产品架构在数字经济时代的应用

数据即产品架构在数字经济时代的应用 在数字经济中,数据已成为核心生产要素,“数据即产品”(Data-as-a-Product)架构通过系统化封装原始数据,实现其可交易、可交付的产品化价值。以下是其架构设计与应用解析&#xff…

MySQL 中的时间序列数据分析与处理

在互联网应用和企业业务系统中,特别是现在当下环境电商以及跨境电商火爆的情况下,时间序列数据无处不在,如电商订单时间、用户登录日志、设备监控数据等。MySQL 作为主流数据库,具备强大的时间序列数据处理能力。本文将结合电商订…

STM32——MDK5编译和串口下载程序+启动模式

一、MDK5编译 1.1 编译中间文件 还可通过 .map文件计算程序大小 中间文件 > 下载到开发板中的文件 > .hex 二、串口下载 2.1 前提须知 2.2 串口硬件链接(M3、M4系列) M7无串口下载 PC端需安装 CH340 USB 虚拟串口驱动:CH340 USB 虚…

HyperWorks仿真案例:拓扑优化与激光增材制造的完美结合挖掘轻量化结构的新潜力

许多技术创新都基于自然界中生物结构的设计。通过不断进化,大自然在数百万年间已学会根据各种形状的功能对形状进行调整,从而最大程度地提高效率。当工程师设法构建坚固而轻盈的结构时,这些自然界中的示例可以提供重要线索。在目前的研究项目…

在Windows系统部署本地智能问答系统:基于百度云API完整教程

引言 在人工智能时代,搭建私有化智能问答系统能有效保护数据隐私并提升响应效率。本教程将手把手教你在Windows环境中,通过百度云API构建专属智能问答系统,全程无需服务器,仅需本地计算机即可运行! 一、环境准备 系统…

Vue的watch函数实现

<script setup> import { watch, ref, reactive, toRefs } from vue;const count ref(0); const obj reactive({name: 张三,age: 18 });// 我们可以使用toRefs&#xff0c;将reactive对象中的属性转换为ref对象&#xff0c;保持响应性&#xff01;&#xff01; const {…

Tomcat 安装使用教程

&#x1f4cc; 什么是 Tomcat&#xff1f; Apache Tomcat 是一个开源的 Java Servlet 容器&#xff0c;也是运行 Java Web 应用最常用的服务器之一&#xff0c;支持 Servlet、JSP 等规范。 &#x1f9f0; 一、准备工作 1. 系统要求 操作系统&#xff1a;Windows / Linux / m…

【邀请】点击邀请链接参加阿里云训练营活动,完成学习送礼品+户外折叠凳,一个小时就能完成

点击邀请链接参加阿里云训练营活动&#xff0c;完成学习送礼品户外折叠凳&#xff0c;快的话一个小时就能完成。 7月28日23:59前完成。 OSS进阶应用与成本优化训练营 礼品如下&#xff1a; 包尖钢笔/祈福小神仙积木/雨伞/不锈钢餐具随机发放 户外折叠凳

用户行为序列建模(篇六)-【阿里】DSIN

简介 DSIN&#xff08;Deep Session Interest Network&#xff09;是阿里巴巴于2019年提出的点击率预估模型。相比于DIN、DIEN&#xff0c;考虑了用户行为序列的内在结构&#xff08;序列是由session组成的&#xff0c;在每个session内&#xff0c;用户行为是高度同构的&#…

现代Web表情选择器组件:分类系统与实现详解

你好呀&#xff0c;我是小邹。今天给博客的emoji表情进行了归类、补充&#xff0c;具体优化如下。 表情选择器的核心价值在于其分类系统。本文将深入解析表情分类体系的设计与实现&#xff0c;通过完整代码示例展示如何构建一个专业级的表情选择器组件。 一、表情分类系统设计…

华为云Flexus+DeepSeek征文 |华为云ModelArts Studio集成OpenAI Translator:开启桌面级AI翻译新时代

华为云FlexusDeepSeek征文 |华为云ModelArts Studio集成OpenAI Translator&#xff1a;开启桌面级AI翻译新时代 引言一、ModelArts Studio平台介绍华为云ModelArts Studio简介ModelArts Studio主要特点 二、OpenAI Translator介绍openai-translator简介openai-translator主要特…

GitHub 趋势日报 (2025年06月27日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 817 twenty 655 awesome 476 free-for-dev 440 Best-websites-a-programmer-shoul…

Java语法通关秘籍:this、构造方法到String核心精粹

文章目录 &#x1f50d; **一、就近原则与this关键字**1. **成员变量**2. **局部变量** &#x1f6e0;️ **二、构造方法&#xff08;构造器&#xff09;**1. **标准格式**2. **有参构造实战**3. **灵魂三问** ❓ &#x1f4e6; **三、JavaBean黄金标准**&#x1f9e0; **四、对…

@Cacheable 等缓存注解是不是也用到了 AOP?

Spring 的声明式缓存注解&#xff08;Cacheable, CachePut, CacheEvict 等&#xff09;是 AOP 技术在实际应用中最强大、最经典的范例之一&#xff0c;其原理与 Transactional 非常相似。 核心思想&#xff1a;一个智能的“秘书” 你可以把 Cacheable 的 AOP 实现想象成一个极…

解锁云原生微服务架构:搭建与部署实战全攻略

目录 一、引言二、微服务拆分2.1 拆分的必要性2.2 拆分方法2.3 注意事项 三、服务注册与发现3.1 概念与原理3.2 常用组件介绍3.3 实践案例 四、负载均衡4.1 作用与原理4.2 实现方式4.3 负载均衡算法4.4 案例与代码实现4.4.1 项目依赖配置4.4.2 配置 Ribbon4.4.3 代码实现负载均…