使用spark流来读取和处理来自kafka的消息并写入hdfs-hive。由于我希望避免创建许多小文件来对文件系统进行垃圾邮件处理,所以我想知道是否有办法确保最小的文件大小,和/或在文件中强制最小数量的输出行(超时除外)。谢谢。
p5cysglq1#
据我所知,没有办法控制输出文件中的行数。但是你可以控制输出文件的数量。控制这一点并考虑数据集的大小可能有助于满足您的需要,因为您可以计算输出中每个文件的大小。你可以用 coalesce 以及 repartition 命令:
coalesce
repartition
df.coalesce(2).write(...)df.repartition(2).write(...)
df.coalesce(2).write(...)
df.repartition(2).write(...)
它们都用于创建作为参数给定的分区数。因此,如果设置2,输出中应该有2个文件。不同之处在于 repartition 您可以增加和减少分区,而 coalesce 你只能减少。另外,请记住 repartition 执行完全洗牌以在分区之间平均分配数据,这可能会耗费资源和时间。另一方面, coalesce 不执行完全洗牌,而是合并现有分区。你可以在这里的另一个答案中找到一个很棒的解释
1条答案
按热度按时间p5cysglq1#
据我所知,没有办法控制输出文件中的行数。但是你可以控制输出文件的数量。
控制这一点并考虑数据集的大小可能有助于满足您的需要,因为您可以计算输出中每个文件的大小。你可以用
coalesce
以及repartition
命令:它们都用于创建作为参数给定的分区数。因此,如果设置2,输出中应该有2个文件。
不同之处在于
repartition
您可以增加和减少分区,而coalesce
你只能减少。另外,请记住
repartition
执行完全洗牌以在分区之间平均分配数据,这可能会耗费资源和时间。另一方面,coalesce
不执行完全洗牌,而是合并现有分区。你可以在这里的另一个答案中找到一个很棒的解释