我正在研究Spark作为一种可能的计算工具,但无法找到我想到的用例的示例。我想做的与map和reduce有些相反(至少在第一步(,这可能使Spark成为这项工作的错误工具,所以在我忽略它之前,我想在这里检查一下是否有人有一些好主意是否可以做到这一点。
数据流如下所示:
- 想法是将一个巨大的表格结构作为输入,然后将其拆分到计算节点集群中(它可以作为文本文件加载,也可以在数据库中(
- 对于此输入结构中的每一行,将有一个逻辑来对行的内容进行分类(例如,如果是抵押贷款、活期账户或其他内容(
- 分类后,开始计算给定类别的分期付款。现在,问题来了 - 我不确定 Spark 是否可以执行这种计算:一个输入行可以产生数百行结果行,例如 4 个最小列:原始行的 ID、日期、金额 1、金额 2
- 将输出保存到新表中
- 然后,将新表与其他几个表合并并应用映射并减少结果
应该在计算节点上完成,因此它可以并行工作,我只想移动一次数据 - 这意味着输入表的单个块将仅由单个节点处理。
这可行吗?如果不是,是否有可用于此目的并与 Spark 集成的替代方案?
您列出的所有内容都非常适合 Spark 典型流程。
- 您可以并行化/分区输入。如何:
- 您可以简单地输入 Java 元素列表
JavaSparkContext.parallelize(...)
,API 将负责其余的工作。 (可选(您可以输入一个额外的参数,告诉您要并行化的程度。 - 使用 SparkContext.readFile(...( 读取和并行化文件,生成字符串的 RDD。您可以通过执行额外的 String.split(...( 和
JavaRDD.map(...)
来进一步将其拆分为列或其他内容。 - 其他API,如用于数据库读取的JDBCRDD,
- 从非并行化数据开始,然后使用
JavaRDD.repartition(...)
将数据拆分到下游。
- 您可以简单地输入 Java 元素列表
- 分类 =
JavaRDD.map(...)
. - 1 行到 x 行 =
JavaRDD.flatMap(...)
。 - 使用
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(..