首页 > 解决方案 > 更改数据块中的 scala 代码以根据电子邮件发送分组数据

问题描述

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

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 次。example@email.com如果上面的代码在 Records 中出现 4x,则将发送 4 封单独的电子邮件。

问题是如何将上述代码更改为更智能并在一封电子邮件中发送数据example@email.com,其中一封电子邮件中有 3x 记录?

编辑:

我已将 sql 中的记录更新为order by email desc. 只需要一个好方法来检查电子邮件是否相同,然后将它们与数组中的数据一起分组generateReport。然后在最后一封电子邮件的索引之后移动到下一组记录。

标签: scalaapache-sparkapache-spark-sqldatabricks

解决方案


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

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

推荐阅读