如何获取 DataFrame 的字符串表示形式(如 Dataset.show)?

问题描述 投票:0回答:3

我需要 Spark 数据帧的有用字符串表示形式。我用

df.show
得到的结果很棒——但我无法以字符串形式获得该输出,因为
showString
调用的内部
show
方法是私有的。有没有什么方法可以让我获得类似的输出,而无需编写方法来复制相同的功能?

apache-spark apache-spark-sql
3个回答
13
投票

showString
只是 private[sql] 这意味着访问它的代码必须位于同一个包中,即
org.apache.spark.sql

技巧是创建一个属于

org.apache.spark.sql
包的辅助对象,但我们要创建的单个方法不是
private
(在任何级别)。

我通常会模仿实例方法的功能,将第一个输入参数作为目标,并使用输入参数来匹配目标方法。

package org.apache.spark.sql
object AccessShowString {
  def showString[T](df: Dataset[T],
      _numRows: Int, truncate: Int = 20, vertical: Boolean = false): String = {
    df.showString(_numRows, truncate, vertical)
  }
}

提示 使用

paste -raw
将代码复制并粘贴到
spark-shell
中。

那就用

showString
吧。

import org.apache.spark.sql.AccessShowString.showString
val df = spark.range(10)
scala> println(showString(df, 10))
+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
|  4|
|  5|
|  6|
|  7|
|  8|
|  9|
+---+

7
投票

如果你真的决定重用现有代码,你可以通过反射访问

showString

scala> val df = spark.range(10)
df: org.apache.spark.sql.Dataset[Long] = [id: bigint]

scala> val showString = classOf[org.apache.spark.sql.DataFrame].getDeclaredMethod("showString", classOf[Int], classOf[Int], classOf[Boolean])
showString: java.lang.reflect.Method = public java.lang.String org.apache.spark.sql.Dataset.showString(int,int,boolean)

scala> showString.setAccessible(true)

scala> showString.invoke(df, 10.asInstanceOf[Object], 20.asInstanceOf[Object], false.asInstanceOf[Object]).asInstanceOf[String]
res2: String =
"+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
|  4|
|  5|
|  6|
|  7|
|  8|
|  9|
+---+
"

0
投票

您可以将打印流重定向为字符串:

import java.io.ByteArrayOutputStream
import java.io.PrintStream

def dataFrameToString(df: DataFrame, numRows: Int = 20, truncate: Int = 20): String = {
  val output = new ByteArrayOutputStream()
  val printStream = new PrintStream(output)
  
  Console.withOut(printStream) {
    df.show(numRows, truncate)
  }
  
  output.toString.trim
}
© www.soinside.com 2019 - 2024. All rights reserved.