问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Apache Hive建表攻略:开启大数据分析之旅

创作时间:
作者:
@小白创作中心

Apache Hive建表攻略:开启大数据分析之旅

引用
CSDN
12
来源
1.
https://blog.csdn.net/Thomson617/article/details/86153924
2.
https://blog.csdn.net/u013421629/article/details/80450047
3.
https://blog.csdn.net/JJBOOM425/article/details/126099886
4.
https://blog.csdn.net/u010834071/article/details/111319669
5.
https://blog.51cto.com/u_16175504/8565491
6.
https://blog.csdn.net/qq_26442553/article/details/78805443
7.
https://blog.csdn.net/ZZQHELLO2018/article/details/103025897
8.
https://blog.csdn.net/m0_75130002/article/details/135747964
9.
https://blog.csdn.net/chenfeng_sky/article/details/107361081
10.
https://www.cnblogs.com/sx66/p/13608103.html
11.
https://cloud.tencent.com/developer/article/1797907
12.
https://developer.aliyun.com/article/226990

在大数据时代,Apache Hive作为一款强大的数据仓库工具,其建表操作是每个数据工程师必须掌握的基本技能。本文将深入探讨Hive的建表方法,帮助你轻松驾驭Hive数据管理,从基础语法到高级技巧,让你全面掌握Hive SQL建表,开启你的大数据分析之旅。

01

Hive建表基础语法

Hive创建表的基本语法如下:

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
  [(col_name data_type [COMMENT col_comment], ... [constraint_specification])]
  [COMMENT table_comment]
  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
  [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
  [SKEWED BY (col_name, col_name, ...) ON ((col_value, col_value, ...), (col_value, col_value, ...), ...) [STORED AS DIRECTORIES]]
  [
   [ROW FORMAT row_format] 
   [STORED AS file_format]
     | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]
  ]
  [LOCATION hdfs_path]
  [TBLPROPERTIES (property_name=property_value, ...)]
  [AS select_statement];

其中,TEMPORARY表示临时表,EXTERNAL表示外部表,IF NOT EXISTS用于避免重复创建。表的列定义包括列名、数据类型和注释。此外,还可以添加表级注释、分区、聚簇、倾斜等属性。

Hive支持多种数据类型,包括基本类型(如INT、STRING、TIMESTAMP)和复杂类型(如ARRAY、MAP、STRUCT)。例如:

CREATE TABLE user_behavior (
  user_id      STRING COMMENT '用户ID',
  event_time   TIMESTAMP COMMENT '事件时间',
  event_date   DATE COMMENT '事件日期',
  channel      STRING COMMENT '渠道来源',
  properties   MAP<STRING,STRING> COMMENT '事件属性'
);

Hive提供了三种创建表的方式:

  1. 直接创建新表:
CREATE TABLE my_table (
  id INT,
  name STRING
);
  1. 使用AS从现有表中选择部分字段创建新表:
CREATE TABLE my_new_table
AS
SELECT id, name
FROM existing_table;

注意:使用AS创建的表不会保留原表的分区信息。

  1. 使用LIKE复制表结构:
CREATE TABLE my_copy_table
LIKE existing_table;

这种方式会复制表结构,包括分区和存储格式。

02

日期字段的处理

在Hive中,日期字段的处理是一个重要话题。Hive支持DATE和TIMESTAMP两种日期类型:

  • DATE:只包含日期部分,格式为yyyy-MM-dd
  • TIMESTAMP:包含日期和时间,格式为yyyy-MM-dd HH:mm:ss

创建包含日期字段的表:

CREATE TABLE user_reg (
  user_id STRING,
  reg_date DATE COMMENT '注册日期',
  reg_time TIMESTAMP COMMENT '注册时间'
);

在处理日期时,经常需要使用Hive提供的日期函数。以下是一些常用的日期函数:

  1. to_date:将日期时间字符串转换为日期
SELECT to_date('2024-01-15 13:34:12');
-- 输出:2024-01-15
  1. from_unixtime:将Unix时间戳转换为指定格式的日期时间
SELECT from_unixtime(1323308943, 'yyyyMMdd');
-- 输出:20111208
  1. unix_timestamp:获取当前Unix时间戳或转换日期时间字符串为Unix时间戳
SELECT unix_timestamp();
-- 输出:当前Unix时间戳

SELECT unix_timestamp('2024-01-15 13:34:12');
-- 输出:1430816254
  1. yearmonthday等函数用于提取日期中的特定部分
SELECT year('2024-01-15 13:34:12');
-- 输出:2024
  1. datediff用于计算两个日期之间的天数差
SELECT datediff('2024-01-15', '2024-01-01');
-- 输出:14
  1. date_adddate_sub用于日期的加减操作
SELECT date_add('2024-01-15', 7);
-- 输出:2024-01-22

在实际应用中,日期字段经常用于分区。例如,可以按天分区:

CREATE TABLE daily_events (
  event_id STRING,
  event_time TIMESTAMP
)
PARTITIONED BY (event_date STRING);
03

高级特性

分区表设计

分区表是Hive中优化查询性能的重要手段。通过将数据按一定规则分散到不同分区,可以显著减少查询时需要扫描的数据量。

Hive支持两种分区类型:

  1. 静态分区:在加载数据时明确指定分区值
INSERT INTO TABLE daily_events PARTITION (event_date='20240115')
SELECT event_id, event_time
FROM staging_events
WHERE event_date = '20240115';

静态分区适用于大文件的加载,效率较高。

  1. 动态分区:在插入数据时自动分配分区
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;

INSERT INTO TABLE daily_events PARTITION (event_date)
SELECT event_id, event_time, event_date
FROM staging_events;

动态分区适合处理大量数据,但需要设置相应的参数。

存储格式选择

Hive支持多种存储格式,其中ORC和Parquet是最常用的两种列式存储格式。

  • ORC(Optimized Row Columnar):源自Hive的存储格式,支持更新操作和ACID特性,压缩率高,查询性能好。适合需要频繁更新的场景。

  • Parquet:源自Google Dremel系统,支持嵌套数据结构,与Protobuf和Thrift等数据格式集成良好。适合存储复杂嵌套数据。

根据实际测试,ORC在存储压缩率和查询速度上均优于Parquet:

存储格式
存储占用(HDFS)
查询耗时(秒)
ORC
58.3G
35
Parquet
311.9G
66

因此,在Hive中推荐优先使用ORC格式。

04

最佳实践

  1. 统一日期格式:建议全表日期字段统一使用yyyy-MM-ddyyyyMMdd格式,避免格式不一致导致的错误。

  2. 分区设计:按天分区时使用STRING类型,避免DATE类型带来的限制。分区字段应选择查询频率较高的维度。

  3. 存储格式选择:优先选择ORC格式,特别是在需要更新操作的场景下。

  4. 数据类型选择:对于日期字段,如果只需要日期部分,使用DATE类型;如果需要精确到秒级,使用TIMESTAMP类型。

  5. 异常处理:在ETL过程中添加数据校验规则,确保日期格式的正确性。

通过掌握这些基础知识和最佳实践,你将能够熟练地在Hive中创建和管理表,为大数据分析奠定坚实的基础。随着经验的积累,你还可以探索更多高级特性,如桶表、倾斜表等,进一步优化数据处理效率。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号