Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spark Scala—批量并行处理不同的子数据帧_Scala_Apache Spark_Parallel Processing_Apache Spark Sql_Outliers - Fatal编程技术网

Spark Scala—批量并行处理不同的子数据帧

Spark Scala—批量并行处理不同的子数据帧,scala,apache-spark,parallel-processing,apache-spark-sql,outliers,Scala,Apache Spark,Parallel Processing,Apache Spark Sql,Outliers,我正在从事一个欺诈交易检测项目,该项目利用spark,主要使用基于规则的方法对传入交易进行风险评分。对于这种基于规则的方法,从历史数据创建几个映射来表示事务中的各种模式,然后在以后对事务进行评分时使用这些映射。由于数据量的快速增加,我们现在正在修改代码以在每个帐户级别生成这些映射 早期的代码是为eg编写的 createProfile(clientdata) 但现在它变成了 accountList.map(account=>createProfile(clientData.filter(s“”“a

我正在从事一个欺诈交易检测项目,该项目利用spark,主要使用基于规则的方法对传入交易进行风险评分。对于这种基于规则的方法,从历史数据创建几个映射来表示事务中的各种模式,然后在以后对事务进行评分时使用这些映射。由于数据量的快速增加,我们现在正在修改代码以在每个帐户级别生成这些映射

早期的代码是为eg编写的

createProfile(clientdata)

但现在它变成了

accountList.map(account=>createProfile(clientData.filter(s“”“account=${account}”))

使用这种方法,可以生成概要文件,但由于这些操作是按顺序进行的,因此似乎不可行

此外,createProfile函数本身正在使用数据帧、sparkContext/sparkContext,因此,这导致无法将这些任务发送到工作节点的问题,因为据我所知,只有驱动程序才能访问数据帧和sparkContext/sparkContext。因此,以下代码不起作用


导入sparkSession.implicit_
val accountListRdd=accountList.toSeq.toDF(“accountNumber”)
accountList.rdd.map(accountrow=>createProfile(clientData.filter(s“”“account=${accountrow.get(0.toString})”)))

上述代码不起作用,但表示所需输出行为的逻辑

我正在研究的另一种方法是使用scala Future在驱动程序级别使用多线程。但即使在这种情况下,在单个
createProfile
函数调用中也会创建许多jvm对象,因此通过增加线程,即使这种方法可行,也会导致大量jvm对象,这本身会导致垃圾收集和内存开销问题

从时间角度来看,createProfile对于一个帐户平均需要10分钟,我们有3000个帐户,所以按顺序需要很多天。使用多线程,即使我们达到10倍,也需要很多天。所以我们需要100秒左右的并行性

如果它存在的话,其中一个可能有效的方法是..假设groupBy类操作中存在类似spark groupBy的东西,在第一级,我们可以按“帐户”分组,然后执行其他操作 (目前的问题是UDF无法处理我们想要执行的操作)

另一个可行的解决方案是SPark流媒体的工作方式- 它有一个
forEachRDD
方法和
spark.streaming.concurrentjobs
参数,允许并行处理多个rdd。我不确定它是如何工作的,但这种实现可能会有所帮助

以上是问题描述和我目前对它的看法

如果有人对此有任何想法,请告诉我!另外,我更喜欢逻辑上的改变,而不是对不同技术的建议