Есть ли способ преобразовать Scala-Spark DataFrame в таблицу HTML или преобразовать DataFrame в карту Scala, а затем преобразовать в Json, а затем в HTML? - PullRequest
0 голосов
/ 22 мая 2019

Я запускаю какой-то тест и получаю небольшой DataFrame с примерно 3-6 столбцами и 10-20 строками.И теперь я хочу отправить это письмо своему коллеге, и для простоты я хочу, чтобы оно было в табличном формате в виде DataFrame, а не скалярной карты Json.

Итак, я хочу преобразовать DataFrame в таблицу HTML, котораяЯ могу прикрепить письмо по электронной почте. (Это будет сделано автоматически после автоматического запуска задачи DataBricks)

До сих пор я пытался преобразовать DataFrame в карту Scala, а затем преобразовать карту в Json.но не смог найти ничего для преобразования json в HTML в Scala.

Я конвертирую df в карту с этим кодом:

val DataFrameToArray = df.collect.map(r => Map(df.columns.zip(r.toSeq):_*))

, который дает результат в виде карты массива ниже (Извините, я забылупомяните, что):

DataFrameToArray: Array[scala.collection.immutable.Map[String,Any]] = Array(map(Name -> Ross, Age -> 31, Gender -> Male), map(Name -> Monica, Age -> 28, Gender -> Female), map(Name -> Joey, Age -> 32, Gender -> Male), map(Name -> Rach, Age -> 29, Gender -> Female))

и теперь я преобразовываю это в массив с кодом ниже:

val newJson = compactRender(decompose(DataFrameToArray))

, который дает результаты как:

newJson: String = [{"Name":"Ross","Age":31,"Gender":"Male"},{"Name":"Monica","Age":28,"Gender":"Female"},{"Name":"Joey","Age":32,"Gender":"Male"},{"Name":"Rach","Age":29,"Gender":"Female"}]

так чтоя совершенно не могу добавить его с помощью класса User case или если вы можете помочь здесь.

1 Ответ

0 голосов
/ 22 мая 2019

Я бы просто написал HTML вывод из вашего Map напрямую.

val records: Array[Map[String, Any]] = Array(
  Map("Name" -> "Ross", "Age" -> 31, "Gender" -> "Male"),
  Map("Name" -> "Monica", "Age" -> 28, "Gender" -> "Female"),
  Map("Name" -> "Joey", "Age" -> 32, "Gender" -> "Male"),
  Map("Name" -> "Rach", "Age" -> 29, "Gender" -> "Female")
)

val htmlTable: String =
  records.map { map =>
    s"<tr><td>${map("Name")}</td><td>${map("Age")}</td><td>${map("Gender")}</td></tr>"
  }.mkString(
    "<table><tr><th>Name</th><th>Age</th><th>Gender</th></tr>",
    "",
    "</table>")

Другой вариант - превратить ваш DataFrame в Dataset[User].

final case class User (name: String, age: Int, gender: String)

val records: Array[User] = df.as[User].collect()

val htmlTable: String =
      records.map {
        case User(name, age, gender)
          s"<tr><td>${name}</td><td>${age}</td><td>${gender}</td></tr>"
      }.mkString(
        "<table><tr><th>Name</th><th>Age</th><th>Gender</th></tr>",
        "",
        "</table>")
...