HiveQL | 个人学习笔记

资料很少,整理一下能用到的。HiveQL 和 Hive SQL 通常指的是同一个东西,都是指 Hive Query Language 的缩写或简称。

1.详情

HiveQL是一种类似SQL的语言, 它与大部分的SQL语法兼容, 但是并不完全支持SQL标准, 如HiveQL不支持更新操作, 也不支持索引和事务, 它的子查询和join操作也很局限, 这是因其底层依赖于Hadoop云平台这一特性决定的, 但其有些特点是SQL所无法企及的。例如多表查询、支持create table as select和集成MapReduce脚本等, 本节主要介绍Hive的数据类型和常用的HiveQL操作。

2.常见用法

  1. 数据定义语言(DDL)

    • 创建数据库:CREATE DATABASE database_name;
    • 删除数据库:DROP DATABASE database_name;
    • 显示所有数据库:SHOW DATABASES;
    • 使用数据库:USE database_name;
    • 创建表:CREATE TABLE table_name (column1 data_type, column2 data_type, ...);
    • 删除表:DROP TABLE table_name;
    • 显示所有表:SHOW TABLES;
    • 修改表结构:ALTER TABLE table_name ADD/ALTER/DROP COLUMN column_name data_type;
  2. 数据操作语言(DML)

  • 插入(覆盖 / 追加)
sql 复制代码
  -- 覆盖整张表
  INSERT OVERWRITE TABLE table_name
  SELECT col1, col2 FROM source_table WHERE ...;

  -- 追加到表/分区
  INSERT INTO TABLE table_name PARTITION (dt='2025-08-19')
  SELECT col1, col2 FROM source_table WHERE ...;
  • 更新数据(仅支持 ACID 表,且需开启事务):
sql 复制代码
UPDATE table_name
SET col = new_value
WHERE condition;
  • 删除数据(仅支持 ACID 表):DELETE FROM table_name WHERE condition;
  1. 数据查询语言(DQL)

    • 聚合函数:COUNT(), SUM(), AVG(), MIN(), MAX()
    • 分组:GROUP BY column1, column2, ... HAVING condition;
    • 排序:ORDER BY column1 ASC/DESC, column2 ASC/DESC, ...;
    • 分页:LIMIT start, count;
    • 连接查询:JOIN table1 ON table1.column = table2.column;
    • 子查询:SELECT * FROM table_name WHERE column IN (SELECT column FROM another_table);
  2. 数据控制语言(DCL)

    • 授权:GRANT permissions ON database_name.table_name TO user_name;
    • 撤销权限:REVOKE permissions ON database_name.table_name FROM user_name;
    • 创建用户:CREATE USER user_name IDENTIFIED BY password;
    • 删除用户:DROP USER user_name;
  3. 其他常用语句

    • 查看表结构:DESCRIBE table_name;
    • 查看表详情:DESCRIBE FORMATTED table_name;
    • 查看表分区:SHOW PARTITIONS table_name;
    • 查看表统计信息:ANALYZE table_name;
    • 查看表数据文件位置:MSCK REPAIR table_name;

3.直接导入CSV到Hive表

3.1方法1:创建hive后导入csv文件

sql 复制代码
-- 创建外部表(数据存储在HDFS,删除表不会删除数据文件)
CREATE EXTERNAL TABLE IF NOT EXISTS my_hive_table (
    column1 STRING,
    column2 INT,
    column3 DOUBLE,
    column4 TIMESTAMP
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','  -- CSV文件分隔符
STORED AS TEXTFILE
LOCATION '/user/hive/warehouse/mydb.db/my_hive_table';  -- 可选,指定存储位置

-- 或者创建内部表(删除表时会同时删除数据)
CREATE TABLE IF NOT EXISTS my_hive_table (
    column1 STRING,
    column2 INT,
    column3 DOUBLE,
    column4 TIMESTAMP
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

-- 将本地CSV文件加载到Hive表(文件会被移动到HDFS)
LOAD DATA LOCAL INPATH '/path/to/local/file.csv' 
INTO TABLE my_hive_table;

-- 加载HDFS上的CSV文件(文件不会被移动)
LOAD DATA INPATH '/hdfs/path/to/file.csv' 
INTO TABLE my_hive_table;

-- 查看前10行数据
SELECT * FROM my_hive_table LIMIT 10;

-- 查看表结构
DESCRIBE FORMATTED my_hive_table;

补充:(1)如果CSV包含标题行,需要跳过:TBLPROPERTIES ("skip.header.line.count"="1"),(2)NULL值处理:TBLPROPERTIES ("serialization.null.format"=""),(3)日期格式:如果CSV中包含日期,可能需要指定格式:TBLPROPERTIES ("timestamp.formats"="yyyy-MM-dd HH:mm:ss");,(4)

大数据量:对于大文件,考虑先将文件上传到HDFS,然后创建外部表指向该位置

3.2 方法2:直接写入

python 复制代码
# 使用PySpark自动推断Schema并创建Hive表
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("CSV to Hive").enableHiveSupport().getOrCreate()

# 自动推断Schema并创建Hive表
df = spark.read.option("header", "true").option("inferSchema", "true").csv("hdfs://path/to/your/file.csv")
df.write.saveAsTable("my_hive_table")

如果csv文件过大,考虑用Dask集群做并行化处理。

Dask 集群 是一个分布式计算框架,用于处理大规模数据(超出单机内存限制)和并行计算任务。它类似于 Spark,但更轻量且灵活,特别适合与 Python 生态(如 Pandas、Scikit-learn)集成。

核心组件:

Scheduler(调度器)管理任务分配和结果收集。有两种类型:LocalCluster:单机多进程(用于开发测试)。SSHCluster:多机分布式(用于生产);

Workers(工作者):执行实际计算的进程。每个 Worker 有自己的内存空间(避免单机内存限制);

Client(客户端):用户接口,用于提交任务(如 dask.dataframe 操作)。

python 复制代码
# Dask + PyHive (直接写入Hive)
import dask.dataframe as dd
from pyhive import hive

# 1. 使用Dask读取大CSV文件
ddf = dd.read_csv(
    'hdfs://path/to/your/large_file.csv',  # 或本地路径
    blocksize='256MB',  # 每个分块大小
    assume_missing=True,  # 自动推断缺失值
    dtype={'column1': 'object', 'column2': 'float64'}  # 可选:指定列类型
)

# 2. 连接到Hive
conn = hive.connect(host='your_hive_server', port=10000, username='your_username')

# 3. 创建Hive表(如果不存在)
create_table_sql = """
CREATE TABLE IF NOT EXISTS my_hive_table (
    column1 STRING,
    column2 DOUBLE,
    ...
)
STORED AS PARQUET
"""
with conn.cursor() as cursor:
    cursor.execute(create_table_sql)

# 4. 分块写入Hive(使用to_sql的替代方案)
def write_partition(partition):
    # 每个分区建立新连接
    with hive.connect(host='your_hive_server', port=10000, username='your_username') as temp_conn:
        partition.to_sql(
            'my_hive_table',
            temp_conn,
            if_exists='append',
            index=False,
            method='multi'
        )
    return None

# 应用写入函数到每个分区
_ = ddf.map_partitions(write_partition).compute()

30分钟入门 Hive SQL(HQL 入门篇) - 钟林子钰的文章 - 知乎
一文学完所有的Hive Sql(两万字最全详解)
Hadoop生态体系

相关推荐
好望角雾眠11 分钟前
第一阶段C#基础-10:集合(Arraylist,list,Dictionary等)
笔记·学习·c#
艾伦~耶格尔14 分钟前
【集合框架LinkedList底层添加元素机制】
java·开发语言·学习·面试
星仔编程26 分钟前
python学习DAY46打卡
学习
大霞上仙1 小时前
实现自学习系统,输入excel文件,能学习后进行相应回答
python·学习·excel
郭庆汝3 小时前
CMake概述用法详细笔记
笔记
武当豆豆3 小时前
C++编程学习(第25天)
开发语言·c++·学习
张人玉3 小时前
XML 序列化与操作详解笔记
xml·前端·笔记
风和日丽 随波逐流3 小时前
java17学习笔记-Deprecate the Applet API for Removal
笔记·学习
淮北也生橘123 小时前
Linux的ALSA音频框架学习笔记
linux·笔记·学习