资料很少,整理一下能用到的。HiveQL 和 Hive SQL 通常指的是同一个东西,都是指 Hive Query Language 的缩写或简称。
1.详情
HiveQL是一种类似SQL的语言, 它与大部分的SQL语法兼容, 但是并不完全支持SQL标准, 如HiveQL不支持更新操作, 也不支持索引和事务, 它的子查询和join操作也很局限, 这是因其底层依赖于Hadoop云平台这一特性决定的, 但其有些特点是SQL所无法企及的。例如多表查询、支持create table as select和集成MapReduce脚本等, 本节主要介绍Hive的数据类型和常用的HiveQL操作。
2.常见用法
-
数据定义语言(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;
- 创建数据库:
-
数据操作语言(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;
-
数据查询语言(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);
- 聚合函数:
-
数据控制语言(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;
- 授权:
-
其他常用语句
- 查看表结构:
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生态体系