使用 Spark 进行顺序逐行处理,无需映射和化简



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

数据流如下所示:

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

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

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

您列出的所有内容都非常适合 Spark 典型流程。

  1. 您可以并行化/分区输入。如何:
    1. 您可以简单地输入 Java 元素列表JavaSparkContext.parallelize(...),API 将负责其余的工作。 (可选(您可以输入一个额外的参数,告诉您要并行化的程度。
    2. 使用 SparkContext.readFile(...( 读取和并行化文件,生成字符串的 RDD。您可以通过执行额外的 String.split(...( 和 JavaRDD.map(...) 来进一步将其拆分为列或其他内容。
    3. 其他API,如用于数据库读取的JDBCRDD,
    4. 从非并行化数据开始,然后使用JavaRDD.repartition(...)将数据拆分到下游。
  2. 分类 = JavaRDD.map(...) .
  3. 1 行到 x 行 = JavaRDD.flatMap(...)
  4. 使用 JavaRDD.foreachPartition(...) 执行并行并发插入(如果您的数据库可以支持它,Oracle 可以(。只要确保你执行批量插入,而不是 x 个单独的插入(批处理与一次提交的 x 插入不同(。

这些都是非常典型的Spark编码,可以从Spark编程指南中阅读。您可以在 Java/Scala/Python 之间切换文档。

我很抱歉提供所有带有JavaDoc链接的信息。起初我没有注意到你的问题是特定于Python的。然而,同样适用,API已经完全映射到Python(至少在大多数情况下,也许有一些改进(。

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

如果我理解你的问题,火花会像这样解决:

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

2.- 通过RDD,映射以在每个寄存器上应用功能

3.- 使用平面图进行乘法结果

4.- 使用 SQLContext 保存

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

然后可以运行mapReduce。

例:

val a = sc.readFile(1(.map(2(.flatMap(3(a.保存(4(

a.join(otherRDD(..

最新更新