在没有 map 和 reduce 的情况下使用 Spark 进行顺序的逐行处理
Using Spark for sequential row-by-row processing without map and reduce
我正在研究 Spark 作为一种可能的计算工具,但无法找到我想到的用例示例。
我想做的与 map 和 reduce 有点相反(至少在第一步),这可能使 Spark 成为这项工作的错误工具,所以在我忽略它之前,我想在这里检查是否有人有一些好主意,如果这个可以做到。
数据流如下所示:
- 想法是将一个巨大的表格结构作为输入,然后将其拆分到计算节点集群(它可以作为文本文件加载,它可以在数据库中)
- 对于此输入结构中的每一行,都会有一个逻辑来class确定该行的内容(例如,如果它是抵押贷款、活期账户或其他)
- class化后开始计算给定 class 的分期付款。现在,问题来了——我不确定 Spark 是否可以执行这种计算:一个输入行可能会产生数百行结果行,例如最少 4 列:原始行的 ID、日期、金额 1、金额 2
- 将输出保存到新的 table
- 然后,将新的 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 典型流程。
- 您并行化/分区您的输入。如何:
- 您只需输入 Java 元素列表
JavaSparkContext.parallelize(...)
,API 将处理其余部分。您可以选择输入一个附加参数,告诉您要并行化的程度。
- 使用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(...)
.
- 其他 API,例如用于数据库读取的 JDBCRDD,
- 从非并行数据开始,然后使用
JavaRDD.repartition(...)
向下游拆分数据。
- 分类 =
JavaRDD.map(...)
.
- 1 行到 x 行 =
JavaRDD.flatMap(...)
.
- 使用
JavaRDD.foreachPartition(...)
执行并行并发插入(如果您的数据库支持,Oracle 支持)。只需确保您执行批量插入,而不是 x 个单独的插入(批量 与一次提交的 x 插入不同 而不是)。
这都是非常典型的Spark编码,可以从Spark Programming Guide中读到。您可以在 Java/Scala/Python.
之间切换文档
对于向 JavaDoc 提供链接的所有信息,我深表歉意。起初我没有注意到您的问题是 Python 具体的。然而,这仍然适用,API 已完全映射到 Python(至少在大多数情况下,可能还有一些改进)。
如果我能给你一个好的建议:在下降 IDE 中工作,为你提供上下文相关的帮助和自动完成。它一定会帮助您发现哪些方法适合您。
我正在研究 Spark 作为一种可能的计算工具,但无法找到我想到的用例示例。 我想做的与 map 和 reduce 有点相反(至少在第一步),这可能使 Spark 成为这项工作的错误工具,所以在我忽略它之前,我想在这里检查是否有人有一些好主意,如果这个可以做到。
数据流如下所示:
- 想法是将一个巨大的表格结构作为输入,然后将其拆分到计算节点集群(它可以作为文本文件加载,它可以在数据库中)
- 对于此输入结构中的每一行,都会有一个逻辑来class确定该行的内容(例如,如果它是抵押贷款、活期账户或其他)
- class化后开始计算给定 class 的分期付款。现在,问题来了——我不确定 Spark 是否可以执行这种计算:一个输入行可能会产生数百行结果行,例如最少 4 列:原始行的 ID、日期、金额 1、金额 2
- 将输出保存到新的 table
- 然后,将新的 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 典型流程。
- 您并行化/分区您的输入。如何:
- 您只需输入 Java 元素列表
JavaSparkContext.parallelize(...)
,API 将处理其余部分。您可以选择输入一个附加参数,告诉您要并行化的程度。 - 使用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(...)
. - 其他 API,例如用于数据库读取的 JDBCRDD,
- 从非并行数据开始,然后使用
JavaRDD.repartition(...)
向下游拆分数据。
- 您只需输入 Java 元素列表
- 分类 =
JavaRDD.map(...)
. - 1 行到 x 行 =
JavaRDD.flatMap(...)
. - 使用
JavaRDD.foreachPartition(...)
执行并行并发插入(如果您的数据库支持,Oracle 支持)。只需确保您执行批量插入,而不是 x 个单独的插入(批量 与一次提交的 x 插入不同 而不是)。
这都是非常典型的Spark编码,可以从Spark Programming Guide中读到。您可以在 Java/Scala/Python.
之间切换文档对于向 JavaDoc 提供链接的所有信息,我深表歉意。起初我没有注意到您的问题是 Python 具体的。然而,这仍然适用,API 已完全映射到 Python(至少在大多数情况下,可能还有一些改进)。
如果我能给你一个好的建议:在下降 IDE 中工作,为你提供上下文相关的帮助和自动完成。它一定会帮助您发现哪些方法适合您。