首先让我告诉大家,我对Spark很新。
我需要在表格中处理大量记录,当它通过电子邮件分组时,它大约是100万。我需要根据针对个人电子邮件的数据集执行多个逻辑计算根据逻辑计算更新数据库
我的代码结构大致类似于
初始数据加载...
导入sparkSession.implicits._ var tableData = sparkSession.read.jdbc(,, connectionProperties).select(" email")。where()
//包含电子邮件数量大于一的分组记录的数据框
var recordsGroupedBy = tableData.groupBy(" email")。count()。withColumnRenamed(" count"," recordcount")。filter(&#34 ; recordcount> 1")。toDF()
现在,在使用processDataAgainstEmail()方法
对电子邮件进行分组后进行处理 。recordsGroupedBy.collect()的foreach(X => processDataAgainstEmail(x.getAs("电子邮件&#34),sparkSession))
这里我看到foreach没有并行执行。我需要并行调用processDataAgainstEmail(,)方法。 但是,如果我尝试通过
进行并行化您好我可以通过调用
获取列表val emailList = dataFrameWithGroupedByMultipleRecords.select(" email")。rdd.map(r => r(0).asInstanceOf [String])。collect()。toList
var rdd = sc.parallelize(emailList)
rdd.foreach(x => processDataAgainstEmail(x.getAs(" email"),sparkSession))
这不受支持,因为我在使用parallelize时无法传递sparkSession。
任何人都可以帮助我,因为在processDataAgainstEmail(,)中,将执行与数据库插入和更新相关的多个操作,并且还需要执行spark数据帧和spark sql操作。
要总结一下,我需要使用sparksession并行调用processDataAgainstEmail(,)
如果不能通过spark会话,该方法将无法在数据库上执行任何操作。我不知道什么是替代方式,因为电子邮件的并行性对于我的场景是必须的。
答案 0 :(得分:0)
forEach是按顺序对列表的每个元素进行操作的列表的方法,因此您一次对其执行一个操作,并将其传递给processDataAgainstEmail
方法。
获得结果列表后,然后调用sc.parallelize
以从您在上一步中创建/操作的记录列表中并行创建数据帧。正如我在pySpark中看到的那样,并行化是创建数据帧的属性,而不是任何操作的结果。