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