更改databricks中的scala代码以基于电子邮件发送分组数据

os8fio9y  于 2021-05-16  发布在  Spark
关注(0)|答案(1)|浏览(495)

我有一个记录表,首先在这里收集:

val finalResults: Array[Records] = 
  sqlContext.sql("select * from Records").as[Records].collect()

然后我循环浏览这些记录,因为这些记录包含一封电子邮件,我只想给收件人发送他们自己的数据:

for(i <- 0 until finalResults.length){
  val email = finalResults(i).email
  val arrayOfRecords : Array[Records] =  Array(finalResults(i))
  val HTMLTableOfRecords: String = generateReport(arrayOfRecords)

  var emailContent : String = "";
  emailContent = s"""<html><head></head><body>
                     <p><h1>TITLE</h1></p>
                     <b>Here are your results:</b><br>
                        ${HTMLTableOfRecords}
                        <br><br>
                     </p>
                     <p>
                     </p>"""

  sendEmail(s"EXAMPLE RECORDS",emailContent, List(email))
}

这样做的问题是收件人数据可能会出现多次,因此电子邮件可能会被删除 example@email.com 至少4次。上面的代码将发送4个单独的电子邮件到 example@email.com 如果它在记录中出现了4倍。
问题是我如何才能改变上述代码更智能,并发送数据,以供用户使用 example@email.com 在一封邮件中有3倍的记录?
编辑:
我已经将sql中的记录更新为 order by email desc . 只是需要一个好的方法,有一个检查的地方,如果电子邮件是同一组,他们一起在数组中的数据然后 generateReport . 然后转到上一封电子邮件索引之后的下一组记录。

0ve6wy6x

0ve6wy6x1#

不需要在sql中排序,您可以使用 groupBy 在scala中,按电子邮件地址对记录进行分组:

finalResults.groupBy(_.email).foreach { case (email, arrayOfRecords) =>
  val HTMLTableOfRecords: String = generateReport(arrayOfRecords)
  // emailContent...
  sendEmail(s"EXAMPLE RECORDS",emailContent, List(email))
}

相关问题