#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