Hive 中的动态分区 - 使用一个固定列进行分区的缺点

Posted

技术标签:

【中文标题】Hive 中的动态分区 - 使用一个固定列进行分区的缺点【英文标题】:Dynamic partitioning in Hive - downside of using one fixed column for partitioning 【发布时间】:2016-12-06 17:41:48 【问题描述】:

我们计划将 Hive 中的动态分区功能用于我们的一个项目。我知道需要设置此参数才能使其正常工作:

hive.exec.dynamic.partition.mode=nonstrict

在我们的集群中,这设置为严格。我们正在努力对此进行更改,但同时我们计划将其作为一种解决方法:

 - Create a fixed column that will always have the same hard-coded value and use this as the first static column for partitioning
 - Use the columns for dynamic partitioning after this static column

这绝对消除了设置上述参数的问题。 Hive 只需要一个静态列,并且很乐意为其他列动态分区

我注意到,正如预期的那样,hive 使用静态分区创建了一个 HDFS 文件夹,然后在其下创建了用于动态分区的文件夹。像这样的:

/baseDir/staticColumn=staticValue/dynamicColumn=dynamicValue1
/baseDir/staticColumn=staticValue/dynamicColumn=dynamicValue2

因此,该解决方案将 HDFS 中的实际数据下推一级,这似乎不是问题/担忧

我的问题是,这个解决方案有什么缺点吗?从性能、可靠性的角度?

【问题讨论】:

忘记笨拙的解决方法。您可以在 HQL 脚本中设置该参数动态,例如set hive.exec.dynamic.partition.mode=nonstrict ; insert into table X partition (PTKEY) select A, B, C, PTKEY from Z ; (除非您的管理员在配置文件中明确将参数定义为“最终”,但我不明白他/她为什么会这样做) -- cf。 cwiki.apache.org/confluence/display/Hive/Tutorial 【参考方案1】:

回答我自己的问题,以防有人感兴趣。我实际上是使用 spark 将数据加载到 Hive 中,就像添加这行代码以允许使用动态分区插入数据一样简单

// Set hive conf to allow dynamic partitions to be created
sqlContext.setConf("hive.exec.dynamic.partition.mode", "nonstrict")

【讨论】:

以上是关于Hive 中的动态分区 - 使用一个固定列进行分区的缺点的主要内容,如果未能解决你的问题,请参考以下文章

什么是hive的静态分区和动态分区,hive动态分区详解

动态分区和静态分区的区别

如何从具有动态分区的选择查询中插入 Hive 中的列?

Hive 动态分区

Hive动态分区报错

hive 动态分区