gpt4 book ai didi

apache-spark - Spark 分别处理多个文件

转载 作者:行者123 更新时间:2023-12-02 04:42:51 26 4
gpt4 key购买 nike

我需要帮助以使用 Apache Spark 实现一个工作流程。我的任务是在接下来:

  • 我有几个 CSV 文件作为源数据。注意:这些文件可能有不同的布局
  • 我有关于我需要如何解析每个文件的信息(这不是问题)
  • 主要目标:结果是带有几个附加列的源文件。我必须在不加入一个输出范围的情况下更新每个源文件。例如:源 10 个文件 -> 10 个结果文件,每个结果文件仅包含来自相应源文件的数据。

  • 据我所知,Spark 可以通过掩码打开许多文件:
    var source = sc.textFile("/source/data*.gz");

    但在这种情况下,我无法识别文件的哪一行。如果我获得源文件列表并尝试通过以下场景进行处理:
    JavaSparkContext sc = new JavaSparkContext(...);
    List<String> files = new ArrayList() //list of source files full name's
    for(String f : files)
    {
    JavaRDD<String> data = sc.textFile(f);
    //process this file with Spark
    outRdd.coalesce(1, true).saveAsTextFile(f + "_out");
    }

    但在这种情况下,我将以顺序模式处理所有文件。

    我的问题是下一个 :如何以并行模式处理多个文件?。例如:一个文件 - 一个执行者?

    非常感谢帮助我!

    最佳答案

    以下是步骤

  • 使用 sparkcontext.wholeTextFiles("/path/to/folder/contains/all/files")
  • 以上返回一个RDD,其中key为文件路径,value为文件内容
  • rdd.map(lambda x:x[1]) - 这给你一个只有文件内容的 rdd
  • rdd.map(lambda x: customeFunctionToProcessFileContent(x))
  • 因为 map 函数是并行工作的,所以你做的任何操作都会更快而且不是顺序的——只要你的任务不相互依赖,这是并行性的主要标准

  • 以上虽然适用于默认分区。因此,您可能无法获得等于输出文件数的输入文件数(因为输出是分区数)。

    您可以根据计数或基于数据的任何其他唯一值重新分区 RDD,因此最终输出文件计数等于输入计数。这种方法将只有并​​行性,但不会达到最佳分区数的性能

    关于apache-spark - Spark 分别处理多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35955500/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com