使用spark进行连续的逐行处理,无需map和reduce

92dk7w1h  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(577)

我正在研究spark作为一个可能的计算工具,但是找不到我想要的用例的例子。我想做的是有点相反的Map和减少(至少在第一步),这可能会使Spark一个错误的工具的工作,所以在我忽略它之前,我想检查这里是否有人有一些好主意,如果这可以做到。
数据流如下所示:
其想法是将一个巨大的表格结构作为输入,然后在计算节点集群中拆分(它可以作为文本文件加载,也可以是db格式)
对于this输入结构中的每一行,都有一个逻辑来对行的内容进行分类(例如,如果是抵押贷款、活期账户或其他内容)
分类后,开始计算给定类的分期付款。现在,问题来了-我不确定spark是否可以执行这种计算:一个输入行可以产生几百行结果,例如4个最小列:原始行的id、日期、数量1、数量2
将输出保存到新表中
然后,将新表与其他几个表合并,并对结果应用map和reduce
当然,计算应该在compute节点上完成,这样它就可以并行工作了,我只想移动数据一次,这意味着输入表的一个块只能由一个节点处理。
这可行吗?如果不是,是否有其他方法可用于此目的并与spark集成?

xmakbtuz

xmakbtuz1#

如果我理解你的问题,在spark中,我会这样解决:
1.-使用spark csv读取并将属性分隔符添加到“\t”
2.-在rdd上,Map在每个寄存器上应用函数
3.-对乘法结果使用平面图
4.-使用sqlcontext保存
5.-使用sqlcontext读取其他表并应用join。
然后可以运行mapreduce。
例子:
val a=sc.readfile(1).map(2).flatmap(3)a.saveas(4)
a、 加入(其他RDD)。。

s71maibg

s71maibg2#

您列出的所有内容都完全符合典型的Spark流。
您可以并行化/划分您的输入。怎样:
您只需输入一个java元素列表 JavaSparkContext.parallelize(...) ,api将处理其余部分。也可以输入一个额外的参数,告诉您要并行化多少。
使用sparkcontext.readfile(…)读取并并行化文件,从而生成字符串的rdd。您可以通过执行额外的string.split(…)和 JavaRDD.map(...) .
其他api,比如用于数据库读取的jdbcrdd,
从非并行数据开始,使用 JavaRDD.repartition(...) 将数据拆分到下游。
分类= JavaRDD.map(...) .
1行到x行= JavaRDD.flatMap(...) .
使用执行并行并发插入 JavaRDD.foreachPartition(...) (如果您的数据库可以支持,oracle也可以)。只需确保执行批插入,而不是x个单独的插入(批插入与一次提交的x个插入不同)。
这都是非常典型的Spark编码,可以阅读Spark编程指南。您可以在java/scala/python之间切换文档。
我很抱歉提供了所有与javadoc链接的信息。一开始我没有注意到你的问题是针对python的。然而,同样的情况仍然适用,api已经完全Map到python(至少在大多数情况下,可能还有一些改进)。
如果我能给你一个很好的建议:在一个提供上下文相关帮助和自动完成的ide中工作。它肯定会帮助你发现什么方法可以为你工作。

相关问题