hive 自动生成动态分区

来源:互联网 发布:mac如何全选照片 编辑:程序博客网 时间:2024/06/10 01:47
一、设置参数--允许使用动态分区可通过set hive.exec.dynamic.partition;查看set hive.exec.dynamic.partition=true;--当需要设置所有列为dynamic时需要这样设置set hive.exec.dynamic.partition.mode=nonstrict;--如果分区总数超过这个数量会报错set hive.exec.max.dynamic.partitions=1000;--单个MR Job允许创建分区的最大数量set hive.exec.max.dynamic.partitions.pernode=1000;二、sql语句insert overwrite table temp_table_new partition(year,month,day)select field1, field2, year, month, dayfrom temp_table;动态分区的使用方法很简单,假设我想向stat_date='20110728'这个分区下面插入数据,至于province插入到哪个子分区下面让数据库自己来判断,那可以这样写:hive> insert overwrite table partition_test partition(stat_date='20110728',province)> select member_id,name,province from partition_test_input where stat_date='20110728';Total MapReduce jobs = 2...3 Rows loaded to partition_testOKstat_date叫做静态分区列,province叫做动态分区列。select子句中需要把动态分区列按照分区的顺序写出来,静态分区列不用写出来。这样stat_date='20110728'的所有数据,会根据province的不同分别插入到/user/hive/warehouse/partition_test/stat_date=20110728/下面的不同的子文件夹下,如果源数据对应的province子分区不存在,则会自动创建,非常方便,而且避免了人工控制插入数据与分区的映射关系存在的潜在风险。注意,动态分区不允许主分区采用动态列而副分区采用静态列,这样将导致所有的主分区都要创建副分区静态列所定义的分区:hive> insert overwrite table partition_test partition(stat_date,province='liaoning')> select member_id,name,province from partition_test_input where province='liaoning';FAILED: Error in semantic analysis: Line 1:48 Dynamic partition cannot be the parent of a static partition 'liaoning'动态分区可以允许所有的分区列都是动态分区列,但是要首先设置一个参数hive.exec.dynamic.partition.mode :hive> set hive.exec.dynamic.partition.mode;hive.exec.dynamic.partition.mode=strict它的默认值是strick,即不允许分区列全部是动态的,这是为了防止用户有可能原意是只在子分区内进行动态建分区,但是由于疏忽忘记为主分区列指定值了,这将导致一个dml语句在短时间内创建大量的新的分区(对应大量新的文件夹),对系统性能带来影响。所以我们要设置:hive> set hive.exec.dynamic.partition.mode=nostrick;再介绍3个参数:hive.exec.max.dynamic.partitions.pernode (缺省值100):每一个mapreduce job允许创建的分区的最大数量,如果超过了这个数量就会报错hive.exec.max.dynamic.partitions (缺省值1000):一个dml语句允许创建的所有分区的最大数量hive.exec.max.created.files (缺省值100000):所有的mapreduce job允许创建的文件的最大数量注意:如果父分区是动态分区,那么子分区不能是静态分区为了让分区列的值相同的数据尽量在同一个mapreduce中,这样每一个mapreduce可以尽量少的产生新的文件夹,可以借助distribute by的功能,将分区列值相同的数据放到一起:hive> insert overwrite table partition_test partition(stat_date,province)> select member_id,name,stat_date,province from partition_test_input distribute by stat_date,province;Total MapReduce jobs = 1...18 Rows loaded to partition_testOK
0 0
原创粉丝点击