为什么要使用分区表
默认情况下,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);
动态分区默认是没有开启。可以通过执行以下命令开启动态分区。
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
标签:string,分区,Hive,分区表,hive,user
From: https://www.cnblogs.com/whiteY/p/17987800