【问题标题】:Repartition in HadoopHadoop中的重新分区
【发布时间】:2021-10-14 19:13:00
【问题描述】:

我的问题主要是理论上的,但是我有一些表已经遵循某种分区方案,可以说我的表是按天分区的,但是在处理数据一段时间后,我们想改为修改月份分区,我可以轻松地使用新的分区定义重新创建表并重新插入数据,这是最好的方法吗?数据量很大时听起来很慢,我已经看到 hive 中有多个用于分区的更改命令,有没有可以帮助我实现所需的命令?

也许还有另一种选择,将文件连接起来,然后用新分区重新创建表?

ALTER TABLE table_name [PARTITION (partition_key = 'partition_value' [, ...])] CONCATENATE;

如果有任何相关的参考资料,他们也很感激。

【问题讨论】:

  • @BenWatson 我明白你的意思,但是这种方法需要对元存储中的表元数据进行某种更改,因为文件夹的数量与我们在最终结果,我觉得你的评论很有帮助,你能详细说明一下这个想法吗?谢谢。

标签: hadoop hive azure-hdinsight hive-partitions hiveddl


【解决方案1】:

如果文件在日常文件夹中,则不能将多个日常文件夹挂载到单月分区中,每个月都需要将文件移动到月文件夹中。您不能将其作为仅元数据操作。

如果你擅长shell脚本,你可以在hadoop fs -ls <table location> | sort中编写循环,在循环保存路径到变量中,检查包含yyyy-MM的子字符串是否与以前不同,然后创建yyyy-MM文件夹。对于循环中的每一行,将所有内容复制到月份位置(hadoop fs -cp daily_location/* month_location/),所有这些都可以在单个循环中完成。

如果您在 S3 上并使用 AWS-CLI 命令,则无需创建文件夹,只需复制即可。

如果小文件太多,可以拼接到月文件夹中,如果是ORC,可以执行ALTER TABLE PARTITION CONCATENATE。如果不是 ORC,那么最好使用 Hive INSERT OVERWRITE,它会为您完成所有这些,您可以配置 merge task,最后您的文件将处于最佳大小。另外,如果添加distribute by partition_col sort by <keys used in filters/joins>,可以提高压缩效率,并可以使用bloom过滤器和内部索引(如果是ORC/Parquet),这将大大减少表大小并提高查询性能。

因此,最好将 Hive 用于此任务,因为它为您提供了改进数据存储的机会:更改存储格式、连接文件、排序以减小压缩大小以及使索引和布隆过滤器真正有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-26
    • 2013-10-21
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 2018-05-17
    相关资源
    最近更新 更多