Pyspark Jupyter - 在 java 代码与 python 代码中创建的数据框

Pyspark Jupyter - dataframe created in java code vs python code

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

package companyX;

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

我将此 class 添加到 pyspark/jupiter class 路径,以便它可以被 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() 时,它会打印在火花日志中,而不是在笔记本单元中。

您可以使用 DataFrame 初始值设定项:

from pyspark.sql import DataFrame, SparkSession

spark = SparkSession.builder.getOrCreate()

DataFrame(b.build(), spark)

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

引用

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

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

如果 SparkSession 获得通过,某些方法如 toPandas() 将无法使用 DataFrame