hive表分区

为什么要使用分区表

默认情况下,Hive中的查询会扫描整个表来获取结果。

现在,考虑一个Hive表,它有数百万行。当一个简单的查询扫描该表时,它会消耗系统资源。而查询将花费大量时间来获取结果,这最终会影响hive应用程序的性能。

因此,在分析如此大的表时,我们需要一种技术来优化查询的性能,其中一种技术就是Hive中的PARTITIONED- 表分区。

分区表的意义在于优化查询。查询时尽量利用分区字段。如果不使用分区字段,就会全部扫描。

hive中如何对表进行分区

分区是Hive中的一种性能调优技术。它在Hive中使用一列或多列作为分区键在表中创建子目录。

例如,web日志按日期分区,一天是一个分区。查询时候,我们可以查询某一天或一段时间的数据,只读取该属性时间的数据,Hive只扫描指定分区的数据分区表,以实现高效查询。

分区表实际就是对应HDFS文件系统上的的独立的文件夹,该文件是夹下是该分区所有数据文件。

普通表和分区表的区别在于:一个Hive表在HDFS上是有一个对应的目录来存储数据,普通表的数据直接存储在这个目录下,而分区表数据存储时,是再划分子目录来存储的。一个分区一个子目录。主要作用是来优化查询性能。

创建分区表:

#时间分区
CREATE EXTERNAL TABLE user_info_test(
serial_number string,
user_name string,
user_age string)
PARTITIONED BY(
dt string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
'hdfs://CMBHHA/apps/hive/datahouse/test/user_info_test';



#省市多分区
CREATE EXTERNAL TABLE user_info_test(
serial_number string,
user_name string,
user_age string)
PARTITIONED BY(
province_code string,
city_code string)
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
LOCATION
'hdfs://CMBHHA/apps/hive/datahouse/test/user_info_test';

加载数据到hive分区

静态分区

在静态分区中,需要手工将数据插入到表的不同分区。

load data local inpath '/home/user1/emp.txt' overwrite into table t1 partition(provice = "hebei",city = "baoding");

动态分区

在数据插入到表中时会自动进行分区存放。


load data local inpath '/home/user1/emp.txt' overwrite into table t1 partition(provice,city);
#可以不指定表分区直接插入数据(原表只有一个serial_number字段,dt为表分区),select最后一个字段值会自动插入对应分区。
表结构
+--------------------------+------------+----------+
|         col_name         | data_type  | comment  |
+--------------------------+------------+----------+
| serial_number            | string     |          |
| dt                       | string     |          |
|                          | NULL       | NULL     |
| # Partition Information  | NULL       | NULL     |
| # col_name               | data_type  | comment  |
| dt                       | string     |          |
+--------------------------+------------+----------+
insert into test.user_info_test select serial_number,dt from test.user_info  where dt='20240123' limit 2

动态分区默认是没有开启。可以通过执行以下命令开启动态分区。

hive> set hive.exec.dynamic.partition.mode=nonstrict       // 分区模式,默认strict		
hive> set hive.exec.dynamic.partition=true                 // 开启动态分区,默认false
hive> set hive.exec.max.dynamic.partitions=1000	           //最大动态分区数, 设为1000


posted @ 2024-01-25 17:50  whiteY  阅读(66)  评论(0)    收藏  举报