有没有办法将 Scala-Spark DataFrame 转换为 HTML table,或者将 DataFrame 转换为 Scala map 然后转换为 Json 然后再转换为 HTML?

Is there a way to convert Scala-Spark DataFrame to HTML table, or converting DataFrame to Scala map then convert to Json and then HTML?

我 运行 进行了一些测试,得到的结果是小型 DataFrame,大约有 3-6 列和 10-20 行。现在我想将这封电子邮件发送给我的同事,为了方便起见,我希望它采用表格格式作为 DataFrame 而不是 Json.

的 scala 映射

所以,我想将 DataFrame 转换为 HTML table,我可以将其附加到电子邮件中。(这将在 DataBricks 的自动化任务 运行 之后自动完成)

到目前为止,我已经尝试将 DataFrame 转换为 Scala 映射,然后将映射转换为 Json。但在 Scala 中找不到将 json 转换为 HTML 的内容。

我正在使用此代码将 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"}]

所以我不太可能将其添加到用户案例 class 中,或者如果您可以在这里提供帮助。

我会直接从您的 Map 输出 HTML

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>")