在没有 map 和 reduce 的情况下使用 Spark 进行顺序的逐行处理

Using Spark for sequential row-by-row processing without map and reduce

我正在研究 Spark 作为一种可能的计算工具,但无法找到我想到的用例示例。 我想做的与 map 和 reduce 有点相反(至少在第一步),这可能使 Spark 成为这项工作的错误工具,所以在我忽略它之前,我想在这里检查是否有人有一些好主意,如果这个可以做到。

数据流如下所示:

  1. 想法是将一个巨大的表格结构作为输入,然后将其拆分到计算节点集群(它可以作为文本文件加载,它可以在数据库中)
  2. 对于此输入结构中的每一行,都会有一个逻辑来class确定该行的内容(例如,如果它是抵押贷款、活期账户或其他)
  3. class化后开始计算给定 class 的分期付款。现在,问题来了——我不确定 Spark 是否可以执行这种计算:一个输入行可能会产生数百行结果行,例如最少 4 列:原始行的 ID、日期、金额 1、金额 2
  4. 将输出保存到新的 table
  5. 然后,将新的 table 与其他几个 table 组合,并在结果上应用映射和缩减

当然,计算应该在计算节点上完成,因此它可以并行工作,我想只移动一次数据 - 这意味着输入的单个块 table 将仅由单个节点处理。

这可行吗? 如果不是,是否有替代方案可用于此目的并与 Spark 集成?

如果我理解你的问题,在 spark 中会这样解决:

1.- 使用 spark-csv 读取并将 prop 分隔符添加到 "\t"

2.- 在 RDD 上,映射以在每个寄存器上应用函数

3.- 使用 flatMap 乘法结果

4.- 使用 SQLContext 保存

5.- 使用 sqlContext 读取其他表并应用连接。

然后可以运行 mapReduce。

示例:

val a = sc.readFile(1).map(2).flatMap(3) a.saveAs(4)

a.join(otherRDD)..

您列出的所有内容都完全符合 Spark 典型流程。

  1. 您并行化/分区您的输入。如何:
    1. 您只需输入 Java 元素列表 JavaSparkContext.parallelize(...),API 将处理其余部分。您可以选择输入一个附加参数,告诉您要并行化的程度。
    2. 使用SparkContext.readFile(...) to read and parallelize a file, producing a RDD of Strings. You can further split it up in columns or something by doing an additional String.split(...) and JavaRDD.map(...).
    3. 其他 API,例如用于数据库读取的 JDBCRDD,
    4. 从非并行数据开始,然后使用 JavaRDD.repartition(...) 向下游拆分数据。
  2. 分类 = JavaRDD.map(...).
  3. 1 行到 x 行 = JavaRDD.flatMap(...).
  4. 使用 JavaRDD.foreachPartition(...) 执行并行并发插入(如果您的数据库支持,Oracle 支持)。只需确保您执行批量插入,而不是 x 个单独的插入(批量 与一次提交的 x 插入不同 而不是)。

这都是非常典型的Spark编码,可以从Spark Programming Guide中读到。您可以在 Java/Scala/Python.

之间切换文档

对于向 JavaDoc 提供链接的所有信息,我深表歉意。起初我没有注意到您的问题是 Python 具体的。然而,这仍然适用,API 已完全映射到 Python(至少在大多数情况下,可能还有一些改进)。

如果我能给你一个好的建议:在下降 IDE 中工作,为你提供上下文相关的帮助和自动完成。它一定会帮助您发现哪些方法适合您。