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

时间:2018-07-06 22:42:52

标签: apache-spark apache-spark-sql

我需要一个Spark数据框的有用的字符串表示形式。我通过df.show获得的方法很棒-但由于showString调用的内部show方法是私有的,因此我无法将输出作为字符串获得。是否可以通过某种方式获得相似的输出而无需编写重复相同功能的方法?

2 个答案:

答案 0 :(得分:5)

如果您确实打算重用现有代码,则可以通过反射方式访问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|
+---+
"

答案 1 :(得分:4)

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|
+---+