获取Spark org.apache.spark.sql.Dataset#show()的输出作为字符串?

时间:2018-12-17 19:00:29

标签: scala apache-spark

有什么方法可以将Dataset#show()的输出检索为String?

以下将其打印到stdout,但是我想知道是否可以将它检索为String并更好地记录它:

val foobarData: DataFrame = ...

println("+++ foobarData.show(): +++") 
foobarData.show()

1 个答案:

答案 0 :(得分:1)

除了提供“访问器”(即org.apache.spark.sql包中的一部分使用包私有API的代码)外,目前无法做到这一点。

package org.apache.spark.sql

object ShowAccessor {
  def show(ds: Dataset[_]): String = ds.showString(20)
}

您可能希望能够指定一组不同的参数(showString还有两个带有默认值的参数),但是总体思路仍然相同。

或者,您可以使用反射来完成上述操作,但是它需要更多的代码(尤其是使用Scala反射),因此我个人更喜欢访问器方法。

不幸的是,这种方法可能不适用于Java 9+(当然,一旦Spark最终支持它),因为Java 9+比Java 8和更早版本更严格地执行模块边界。在这种情况下,可能需要使用反射来访问此API。

作为旁注,当我发现公共Spark API没有提供show()输出到字符串时,我感到非常惊讶。我认为这样做是没有道理的,如果您想这样做,会给您带来很多不便。使用SLF4J记录器打印数据框。