1

我在 java 中有一个类,可以构建一些复杂的 Spark DataFrame。

package companyX;

class DFBuilder {
   public DataFrame build() {
       ...
       return dataframe;
   }
}

我将这个类添加到 pyspark/jupiter 类路径中,以便它可以被 py4j 调用。现在当我调用它时,我会得到奇怪的类型:

b = sc._jvm.companyX.DFBuilder()
print(type(b.build()))
#prints: py4j.java_gateway.JavaObject

VS

print(type(sc.parallelize([]).toDF()))
#prints: pyspark.sql.dataframe.DataFrame

有没有办法将此 JavaObject 转换为正确的 pyspark 数据帧?我遇到的一个问题是,当我想在 java 中构建的 DataFrame 上调用 df.show() 时,它会打印在 spark 日志中,而不是在笔记本单元格中。

4

2 回答 2

2

您可以使用DataFrame初始化程序:

from pyspark.sql import DataFrame, SparkSession

spark = SparkSession.builder.getOrCreate()

DataFrame(b.build(), spark)

如果您使用过时的 Spark 版本,请将SparkSession实例替换为SQLContext.

参考 Zeppelin: Scala Dataframe to python

于 2018-03-14T11:13:50.707 回答
1

从 spark 2.4 开始,您仍然应该使用SQLContext而不是SparkSession在 python one 中包装 scala 数据帧时使用。一些相关pyspark session代码:

self._wrapped = SQLContext(self._sc, self, self._jwrapped)
...
# in methods returning DataFrame
return DataFrame(jdf, self._wrapped)

如果SparkSession通过了某些方法,例如toPandas()将不适用于此类DataFrame.

于 2019-08-30T10:31:24.373 回答