Измените код scala в databricks для отправки сгруппированных данных на основе электронной почты

#scala #apache-spark #apache-spark-sql #databricks

#scala #apache-spark #apache-spark-sql #databricks

Вопрос:

У меня есть таблица записей, которая сначала собирается здесь:

 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 . Затем перейдите к следующему набору записей после индекса последнего электронного письма.

Ответ №1:

Нет необходимости сортировать в sql, вы можете использовать groupBy scala для группировки ваших записей по адресу электронной почты:

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

Комментарии:

1. Спасибо, но как это позволит группировать данные, зависящие от электронной почты, чтобы я мог отправить, скажем example1@email.com его собранные данные и example2@email.com его данные?

2. arrayOfRecords Содержит все записи для одного адреса электронной почты. Я обновил свой ответ, чтобы было немного понятнее, что вы можете сделать с ним впоследствии.

3. ах, я вижу, так что цикл тоже не нужен?

4. Нет, то, что вы сделали с циклом, я сделал с foreach