【问题标题】:Pyspark Jupyter - dataframe created in java code vs python codePyspark Jupyter - 在 java 代码与 python 代码中创建的数据框
【发布时间】:2018-03-14 10:55:26
【问题描述】:

我在 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 日志中,而不是在笔记本单元格中。

【问题讨论】:

    标签: apache-spark pyspark jupyter-notebook py4j


    【解决方案1】:

    你可以使用DataFrame初始化器:

    from pyspark.sql import DataFrame, SparkSession
    
    spark = SparkSession.builder.getOrCreate()
    
    DataFrame(b.build(), spark)
    

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

    参考Zeppelin: Scala Dataframe to python

    【讨论】:

      【解决方案2】:

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

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

      如果 SparkSession 被传递,则某些方法(例如 toPandas())将无法与此类 DataFrame 一起使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-30
        • 2023-02-24
        • 1970-01-01
        • 1970-01-01
        • 2017-06-06
        • 2017-03-05
        • 1970-01-01
        相关资源
        最近更新 更多