在Spark-Scala应用程序中将df.show()的内容保存为字符串

15

我需要将df.show()的输出保存为字符串,以便可以直接通过电子邮件发送。

例如,以下示例取自官方Spark文档:

val df = spark.read.json("examples/src/main/resources/people.json")

// Displays the content of the DataFrame to stdout
df.show()
// +----+-------+
// | age|   name|
// +----+-------+
// |null|Michael|
// |  30|   Andy|
// |  19| Justin|
// +----+-------+

我需要将上述表格保存为字符串并在控制台中打印出来。我尝试使用log4j来打印日志,但没有找到仅记录输出的信息。

有人能帮我解决这个问题吗?


已经有人回答了这个问题: https://dev59.com/mqTja4cB1Zd3GeqPBWzP - Raphael Roth
2个回答

25

scala.Console有一个withOut方法用于处理这种情况:

val outCapture = new ByteArrayOutputStream
Console.withOut(outCapture) {
  df.show()
}
val result = new String(outCapture.toByteArray)

我在运行这个程序时遇到了一个问题,与java.io冲突,所以我将一行代码改为scala.Console.withOut(outCapture),然后它就正常工作了。 - undefined

6

解决方法是将标准输出重定向到变量:

val baos = new java.io.ByteArrayOutputStream();
val ps =  new java.io.PrintStream(baos);

val oldPs = Console.out
Console.setOut(ps)
df.show()
val content = baos.toString()
Console.setOut(oldPs)

请注意,这里有一个弃用警告。
您还可以重新实现方法Dataset.showString,该方法生成数据。它在后台使用了take。也许现在是创建PR并使showString公开的好时机? :)

1
会尝试并更新评论..现在正在查看它。 - Omkar
T. Gawęda 提供的解决方法对我来说效果很好。 - Varun Taliyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接