hive动态分区插入

动态分区插入(即多分区插入)旨在通过在扫描输入表时动态确定应该创建和填充的分区来解决此问题。该功能仅适用于0.6.0及以上版本。在动态分区插入中,将评估输入列值以确定应该将该行插入哪个分区。该分区如果尚未被创建,则会自动被创建。使用该功能,只需要一个insert语句来创建和填充所有必需的分区。另外,由于只有一个insert语句,因此只有一个相应的MapReduce作业。与多个insert语句相比,这显著提高了性能并减少了Hadoop集群工作负载。

 

动态分区插入语句的语义:

  • 当动态分区列已存在非空分区时(例如,某些dt根分区下存在country ='CA'),如果动态分区插入在输入数据中看到相同的值(例如'CA'),它将被覆盖 。这与'insert overwrite'语义一致。但是,如果输入数据中未出现分区值“CA”,则现有分区不会被覆盖。
  • 由于Hive分区对应于HDFS中的目录,因此分区值必须符合HDFS路径格式(Java中的URI)。 任何在URI中具有特殊含义的字符(例如,'%',':','/','#')都将使用'%'后跟其ASCII值的2个字节进行转义。
  • 如果输入列的类型不是STRING类型,则其值将被转换为STRING类型以用于构造HDFS路径。
  • 如果输入列值为NULL或空字符串,则该行将被放入一个特殊分区,该分区的名称由hive参数hive.exec.default.partition.name控制。默认值为HIVE_DEFAULT_PARTITION {}。基本上,该分区将包含其值不是有效分区名称的所有行。这种方法的警告是,如果你选择Hive,那么无效的值将会丢失并被HIVE_DEFAULT_PARTITION {}取代。JIRA HIVE-1309可以让用户指定“坏文件”以保留输入分区列值。
  • 动态分区插入可能占用大量资源,因为它可以在短时间内生成大量分区。
  • 我们希望防止动态分区插入的另一种场景是,用户可能只是想覆盖一个静态分区的子分区,但是粗心地忘记指定一个静态分区,将所有分区指定为动态分区。我们定义另一个参数hive.exec.dynamic.partition.mode = strict来防止全动态分区的情况。在strict模式下,您必须至少指定一个静态分区。默认模式是strict的。另外,有一个参数hive.exec.dynamic.partition = true/false来控制是否允许动态分区。Hive 0.9.0之前的默认值为false,而Hive 0.9.0及更高版本中的默认值为true。
  • 在Hive 0.6中,动态分区插入不适用于hive.merge.mapfiles = true或hive.merge.mapredfiles = true,因此它在内部关闭merge参数。Hive 0.7支持合并动态分区插入中的文件(有关详细信息,请参阅JIRA HIVE-1307)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值