Hadoop 中的重新分区

Repartition in Hadoop

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

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

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

如果有任何相关的参考资料,也非常感谢。

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

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

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

如果小文件太多,你可能想把它们拼接在每月的文件夹中,如果是ORC,你可以执行. If not ORC, then better use Hive INSERT OVERWRITE, it will do all that for you, you can configure merge task,最后你的文件将达到最佳大小。此外,如果添加 distribute by partition_col sort by <keys used in filters/joins>,您还可以提高压缩效率并可以使用布隆过滤器和内部索引(如果它是 ORC/Parquet),这将大大减少 table 大小并提高查询性能。

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