Repartition in Hadoop



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

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

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

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

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

如果你擅长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,它会为你做所有的事情,你可以配置合并任务,最后你的文件将在最佳大小。此外,如果添加distribute by partition_col sort by <keys used in filters/joins>,您可以提高压缩效率,并且可以使用bloom过滤器和内部索引(如果是ORC/Parquet),这将大大减少表大小并提高查询性能。

所以,最好使用Hive来完成这个任务,因为它给了你改进数据存储的机会:改变存储格式,连接文件,排序以减少压缩大小,使索引和bloom过滤器非常有用。