【问题标题】:Hive Merge all Partitions using HIVE CONCATENATEHive 使用 HIVE CONCATENATE 合并所有分区
【发布时间】:2018-12-28 06:47:44
【问题描述】:

我有一个 hive 外部表,它在源系统上分区,这意味着数据将来自多个源系统。 数据目录结构为:

/app/hadoop/MyProject/SchemaName/TableName/PartitionColumn=SoruceSystem1

/app/hadoop/MyProject/SchemaName/TableName/PartitionColumn=SoruceSystem2

/app/hadoop/MyProject/SchemaName/TableName/PartitionColumn=SoruceSystem3

...

/app/hadoop/MyProject/SchemaName/TableName/PartitionColumn=SoruceSystemN

并且所有进入SourceSystem文件夹的数据都是流数据,所以我们在每个源系统下得到了很多文件:)。

我正在考虑每天合并一次所有这些文件,例如:SourceSystem1 中的所有文件都将被合并,合并后的文件保留在 SoruceSystem1 文件夹中等等。

通常: alter table schema.table PARTITION(PartitionColumn={SourceSystemName}) CONCATENATE; 在只有一个文件夹的情况下效果很好,但我需要一次性对所有文件夹进行操作。

解决方法是编写一个 shell 脚本 循环遍历所有分区,然后为每个源系统名称重复此语句,但我正在寻找开箱即用的方法来解决这个问题用例。

非常感谢这里的任何帮助。

【问题讨论】:

  • 你需要写这样一个shell脚本(用hdfs dfs -ls 获取分区,而不是用Hive describe)

标签: bash hadoop hive hdfs bigdata


【解决方案1】:

重要 - 如果您的表架构已经发展(例如添加了新列),但仍包含使用旧架构的文件。 CONCATENATE 可能会默默地删除这些文件。见Bug report。如果表是非托管的,则已采取变通方法使此操作失败,并最终在 Hive 3.0.0 中修复。

现在已经不碍事了,我们需要分两步完成。

首先,我们获取相关表中的分区并将它们写入一个文本文件,以便我们稍后参考。

beeline --showHeader=false --outputformat=tsv2 --silent=true -e "SHOW PARTITIONS database.table" > found_partitions.txt

这将写入找到的没有标题或框架的分区列表。

接下来,我们需要遍历分区列表,用逗号交换潜在的分区分隔符 (part1=some/part2=thing),因为前者不是合法的 Hive 字符。如果您的表中只有一个分区结构,这将无济于事。我们还假设您的所有分区都是字符串,并且需要用引号括起来。

#!/bin/bash

for line in `cat found_partitions.txt`; do
    echo "the next partition is $line"
    partition=`(echo $line | sed -e 's/\//,/g' -e "s/=/='/g" -e "s/,/',/g")`\'
    beeline -e "ALTER TABLE database.table PARTITION($partition) CONCATENATE" 
done

注意:您可能需要设置一些配置才能让 Beeline 为您工作。可能想为此设置一个别名。

 beeline -u "jdbc:hive2://<SERVER>:<PORT>/;serviceDiscoveryMode=<zooKeeper>;zooKeeperNamespace=<hiveserver2>;principal=<USER>;transportMode=<SOMETHING>;httpPath=<SOMETHING>"

【讨论】:

  • 完美答案。您的评论中只有 1 个小语法错误 echo stmt 末尾的双引号。 echo "下一个分区是 $line"
  • @SagarMorakhia 我错过了。谢谢修复。
猜你喜欢
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 2015-06-12
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
相关资源
最近更新 更多