分区表
静态分区与动态分区的主要区别在于静态分区是手动指定,而动态分区是通过数据来进行判断。详细来说,静态分区的列实在编译时期,通过用户传递来决定的;动态分区只有在SQL执行时才能决定。
动态分区
启用hive动态分区,只需要在hive会话中设置两个参数:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
插入数据
动态分区的使用方法很简单,假设我想向stat_date='20110728’这个分区下面插入数据,至于province插入到哪个子分区下面让数据库自己来判断。那可以这样写:
insert overwrite table partition_test partition(stat_date='20110728',province)
select
member_id
,name
,province
from
partition_test_input
where
stat_date='20110728';
运行Spark的时候,同时跑多个任务对同一张表(parquet格式),同时写多个Hive分区,需要加一下参数set("spark.sql.hive.convertMetastoreParquet","false"); 这样的话,所使用的spark临时目录就是独立(静态分区默认共用一个临时目录),不会冲突。 如果是orc格式,里面的关键字改成orc就行。