You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将DataFrame输出存储为下拉格式以生成每日集群报告

解决按日期生成可折叠集群报告的问题

你需要把每日的任务数据按日期分组,生成可折叠(下拉)格式的报告来高效展示数百个任务的状态,下面是用Scala+Spark实现的具体方案:

步骤1:按日期聚合任务数据

首先我们要把原始DataFrame按Date分组,收集每个日期下的所有任务记录,这样后续能针对每个日期生成独立的折叠块:

import org.apache.spark.sql.functions._

// 假设你的原始DataFrame名为jobDF
val groupedDF = jobDF.groupBy("Date")
  .agg(collect_list(struct("Job_Id", "job_Status", "Run_Time")).alias("daily_jobs"))

这段代码会生成一个新的DataFrame,每行对应一个日期,daily_jobs字段是该日期所有任务的结构化列表。

步骤2:生成可折叠的Markdown报告

Markdown的<details>和<summary>标签可以实现原生折叠效果,非常适合展示每日大量任务的场景。我们遍历聚合后的DataFrame,生成每个日期的折叠块:

import java.io.PrintWriter

// 把聚合后的数据收集到Driver端(如果日期/任务量极大,建议用下面的foreachPartition方式)
val dailyReportBlocks = groupedDF.collect().map { row =>
  val date = row.getAs[String]("Date")
  val jobs = row.getAs[Seq[org.apache.spark.sql.Row]]("daily_jobs")
  
  // 构造单个日期的折叠块内容
  s"""<details>
     |<summary>Date $date</summary>
     |
     || Job_Id | 任务状态 | 运行时长 |
     ||--------|----------|----------|
     |${jobs.map(job => s"| ${job.getAs[String]("Job_Id")} | ${job.getAs[String]("job_Status")} | ${job.getAs[String]("Run_Time")} |").mkString("\n")}
     |
     |</details>""".stripMargin
}.mkString("\n\n")

// 将报告写入文件
new PrintWriter("/your/report/path/cluster_daily_report.md") {
  write(dailyReportBlocks)
  close()
}

大数据量优化方案

如果每日任务数特别多,collect()可能导致Driver内存溢出,这时候可以用foreachPartition分批处理:

import java.io.{FileOutputStream, PrintWriter}

groupedDF.foreachPartition { partition =>
  // 以追加模式写入文件,避免覆盖之前的内容
  val writer = new PrintWriter(new FileOutputStream("/your/report/path/cluster_daily_report.md", true))
  partition.foreach { row =>
    val date = row.getAs[String]("Date")
    val jobs = row.getAs[Seq[org.apache.spark.sql.Row]]("daily_jobs")
    val block = s"""<details>
                   |<summary>Date $date</summary>
                   |
                   || Job_Id | 任务状态 | 运行时长 |
                   ||--------|----------|----------|
                   |${jobs.map(job => s"| ${job.getAs[String]("Job_Id")} | ${job.getAs[String]("job_Status")} | ${job.getAs[String]("Run_Time")} |").mkString("\n")}
                   |
                   |</details>""".stripMargin
    writer.write(block + "\n\n")
  }
  writer.close()
}

最终效果

生成的报告中,每个日期会显示为可点击的标题,点击后展开该日所有任务的表格,既节省空间又方便查看,完全适配每日数百个任务的场景。

内容的提问来源于stack exchange,提问作者Pravinkumar Hadpad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:46:52