hive的分区类型:理解HIVE分区
hive的分区类型:理解HIVE分区load data local inpath '/opt/aaa' overwrite into table par_tab partition (sex='m'); 静态分区,插入的时候必须首先要知道有什么分区类型,而且每个分区写一个loaddata。 创建分区的时候使用Partitioned by 关键字定义。 创建静态分区 create table par_tab (name string nation string) partitioned by (sex string) row format delimited fields terminated by ' ';
看完此文你将理解:
1、静态分区
2、动态分区
3、spark 怎么动态分区
静态分区
静态分区是指人为的指定分区名。向分区插入数据的时候也要写明写入那个分区。
创建分区的时候使用Partitioned by 关键字定义。
创建静态分区
create table par_tab (name string nation string) partitioned by (sex string) row format delimited fields terminated by ' ';
静态分区,插入的时候必须首先要知道有什么分区类型,而且每个分区写一个loaddata。
load data local inpath '/opt/aaa' overwrite into table par_tab partition (sex='m');
动态分区
动态分区可以允许所有的分区列都是动态分区列。
使用动态分区可解决以静态分区必须每次指定字段值load数据的问题,其可以根据查询得到的数据动态分配到分区里。
简单点理解就是静态分区是由手动指定目录,而动态分区是hive自动帮我们指定目录。
动态分区不允许主分区采用动态列而副分区采用静态列,这样将导致所有的主分区都要创建副分区静态列所定义的分区。这是因为hive的分区数据是元数据的一部分,由hdfs的namenode进行管理,hive 启动后,会缓存在内存中,一级分区过多会影响集群性能。
假如动态分区作为一级分区,那必将产生非常多的分区目录,即一级目录。这样子一级目录过多就会给namenode 产生过大的压力,影响hdfs集群性能。
动态分区几个参数:
hive.exec.dynamic.partition
默认值:false 是否开启动态分区功能,默认false关闭。
使用动态分区时候,该参数必须设置成true。
hive.exec.dynamic.partition.mode
动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区,
nonstrict模式表示允许所有的分区字段都可以使用动态分区。
一般需要设置为nonstrict
hive.exec.max.dynamic.partitions.pernode
在每个执行MR的节点上,最大可以创建多少个动态分区。
该参数需要根据实际的数据来设定。
比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,
如果使用默认值100,则会报错。
hive.exec.max.dynamic.partitions
默认值:1000 在所有执行MR的节点上,最大一共可以创建多少个动态分区。
hive.exec.max.created.files
默认值:100000 整个MR Job中,最大可以创建多少个HDFS文件。
hive.error.on.empty.partition
默认值:false 当有空分区生成时,是否抛出异常。 一般不需要设置。
spark 方式进行动态分区
dataframe模式
conf = SparkConf().setAppName(app).set('spark.sql.sources.partitionOverwriteMode' 'dynamic')
df_table=hive_ctx.createDataFrame(table_rdd table_schema)
df_table.write.saveAsTable(database '.' a_table format=format mode='overwrite' partitionBy='data_date' path=output_path)
//data_date 为分区时间
sql 模式
a_table_view=a_table "_view" df_table.createOrReplaceTempView(a_table_view)
## 创建视图
hive_ctx.sql("set hive.exec.dynamic.partition.mode = nonstrict")
hive_ctx.sql("set hive.exec.dynamic.partition = true")
hive_ctx.sql("use " database).show()
## 转换表
sql="insert overwrite table %s partition(data_date) select * from %s " % (a_table a_table_view)
## 进行分区增量覆盖
hive_ctx.sql(sql)
sql 模式通过创建一个视图,然后用sql insert overwrite 实现。其中partition(data_date) 指定的分区。