有什么方法可以将Dataset#show()
的输出检索为String?
以下将其打印到stdout,但是我想知道是否可以将它检索为String并更好地记录它:
val foobarData: DataFrame = ...
println("+++ foobarData.show(): +++")
foobarData.show()
答案 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记录器打印数据框。