如何将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
相关产品推荐
相关产品推荐

