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 中的动态分区 - 使用一个固定列进行分区的缺点的主要内容,如果未能解决你的问题,请参考以下文章