我正在使用spark处理一个非常大的数据集。数据存储为avro文件。数据也以目录结构(/ input / yyyy / MM / dd / HH /)组织。例如,今天的avro文件将位于/ input / 2016/03/18/00至/ input / 2016/03/18/23
现在,如果我处理过去2年的数据,则会处理许多avro文件。
数据处理代码如下
nextOffset
现在我使用Hue进入输出。我看到181页,在每个页面上我看到很多空的avro文件。
并非所有文件都是空的......但是有太多空文件。
如果我不想要空文件怎么办? (不诉诸“收集”)
答案 0 :(得分:1)
每个输入文件至少生成一个RDD(如果文件很大,我可能会在多个输入序列中读取,并生成多个RDD)。
在您的应用程序中,您在这些RDD上执行过滤器,因此很可能相当一些RDD最终为空,因为它们的所有行都被过滤掉了。保存DataFrame时,每个RDD将保存到不同的PART文件中,因此空RDD将生成一个空的RDD文件。
要解决此问题,请使用.coalesce(n)
,这将缩小RDD的数量。
所以在最后一行尝试这样的事情:
outputDF.coalesce(200).save(s"/output/${datePath(date)}", "com.databricks.spark.avro")
合并中使用的数字在很大程度上取决于数据的大小。如果你有太多的RDD,由于驱动程序的通信开销会导致很多性能损失;如果你的RDD太少,你可能没有使用所有可用的执行程序,这也会导致性能低于最佳状态。