Spark:按键

时间:2018-05-02 06:44:44

标签: scala apache-spark dataframe

我正在尝试使用以下代码输出记录:

spark.createDataFrame(asRow, struct)
      .write
      .partitionBy("foo", "bar")
      .format("text")
      .save("/some/output-path")

数据很小时我没有问题。但是,当我处理~600GB输入时,我正在编写大约290k文件,其中包括每个分区的小文件。有没有办法可以控制每个分区的输出文件数量?因为现在我正在写很多小文件,但这并不好。

2 个答案:

答案 0 :(得分:1)

拥有大量文件是预期的行为,因为每个分区(导致您在写入之前的任何计算)将写入您请求相关文件的分区

如果您希望避免在写作之前需要重新分配:

while ($row = mysqli_fetch_row($result)) {

    $data = array();

    for ($i = 0; $i < mysqli_num_fields($result); $i++) {
        $data[$i] = $row[$i];
    }

    $writer->writeSheetRow('Sheet1', $data);
}

$writer->writeToStdOut();
exit(0);

答案 1 :(得分:0)

每个分区有多个文件,因为每个节点都将输出写入自己的文件。这意味着如何每个分区只有一个文件的唯一方法是在写入之前重新分区数据。请注意,这将是非常低效的,因为数据重新分区将导致数据混乱。