apache-spark - 如何控制Spark作业在写入时创建的输出部分文件的数量?

标签 apache-spark hive apache-spark-sql parquet

我有几个 Spark 作业,每天处理数千个文件。文件大小可能从 MB 到 GB 不等。完成工作后,我通常使用以下代码保存

finalJavaRDD.saveAsParquetFile("/path/in/hdfs"); OR
dataFrame.write.format("orc").save("/path/in/hdfs") //storing as ORC file as of Spark 1.4

Spark 作业在最终输出目录中创建大量小部件文件。据我了解 Spark 为每个分区/任务创建部分文件 - 这是正确的吗?我们如何控制 Spark 创建的零件文件数量?

最后,我想使用这些 parquet/orc 目录创建 Hive 表,我听说当我们有大量小文件时,Hive 很慢。

最佳答案

您可能想尝试使用DataFrame.coalesce减少分区数量的方法;它返回一个具有指定数量分区的 DataFrame(每个分区在插入时都成为一个文件)。

要增加或减少分区,您可以使用Dataframe.repartition函数。 但coalesce不会导致随机播放,而repartition则会导致随机播放。

关于apache-spark - 如何控制Spark作业在写入时创建的输出部分文件的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31249265/

相关文章:

apache-spark - Spark RDD.aggregate vs RDD.reduceByKey?

java - MapReduce:如何将 HashMap 传递给映射器

hadoop - 将数据导入到HVE中(使用Google图书的n-grams数据查找趋势主题)

hadoop - 使用 zookeeper 解析 hive 连接 url

scala - 在 Scala Spark Dataframe 中填充空值

apache-spark - 如何使用 usingColumns 连接 spark 中的嵌套列

python - Spark窗口函数,根据数据集中的值创建排名列

sql - 为什么转换为时间戳会给出两个不同的结果

python - 如何在 Pyspark 中找到数组列的多模式

python - 从 Spark 写入 cassandra 时忽略大小写