【问题标题】: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?有没有办法将 Scala-Spark DataFrame 转换为 HTML 表,或者将 DataFrame 转换为 Scala 地图然后转换为 Json 再转换为 HTML?
【发布时间】:2019-10-09 08:36:56
【问题描述】:

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

所以,我想将 DataFrame 转换为 HTML 表格,我可以在电子邮件中附加。(这将在 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"}]

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

【问题讨论】:

    标签: html json scala apache-spark-sql scala-collections


    【解决方案1】:

    我会直接从您的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>")
    

    【讨论】:

    • 谢谢它可以派上用场,但我正在转换 df 所以我没有用户类。如果你能帮助我。评论太长了,所以我更新了具体问题。
    猜你喜欢
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 2018-11-08
    • 2017-05-20
    • 2017-03-17
    相关资源
    最近更新 更多