Sas*_*lla 7 apache-spark apache-spark-sql
我需要一个Spark数据框的有用的字符串表示形式。我得到的df.show
那个很棒-但是我不能以字符串形式获得该输出,因为showString
by调用的内部方法show
是私有的。有什么方法可以得到相似的输出,而无需编写重复相同功能的方法?
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)
}
}
Run Code Online (Sandbox Code Playgroud)
TIP使用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|
+---+
Run Code Online (Sandbox Code Playgroud)
小智 6
如果您确实打算重用现有代码,则可以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|
+---+
"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1442 次 |
最近记录: |