Pyspark Jupyter -在java代码与python代码中创建的 Dataframe

siotufzp  于 2023-02-09  发布在  Apache
关注(0)|答案(3)|浏览(144)

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

package companyX;

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

我把这个类添加到pyspark/jupiter类路径中,这样它就可以被py 4j调用了。现在当我调用它的时候,我得到了一个奇怪的类型:

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

对比分析

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

有没有办法把这个JavaObject转换成合适的pyspark Dataframe ?我遇到的一个问题是,当我想df.show在java构建的 Dataframe 上调用www.example.com()时,它会打印在spark日志中,而不是笔记本单元格中。

k5hmc34c

k5hmc34c1#

可以使用DataFrame初始化器:

from pyspark.sql import DataFrame, SparkSession

spark = SparkSession.builder.getOrCreate()

DataFrame(b.build(), spark)

如果您使用过时的Spark版本,请将SparkSession示例替换为SQLContext
参考Zeppelin: Scala Dataframe to python

dgiusagp

dgiusagp2#

从spark 2.4开始,当你在python one中 Package scala Dataframe 时,你仍然应该使用SQLContext而不是SparkSession

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

如果SparkSession被传递,一些方法如toPandas()将不能与DataFrame一起工作。

qlvxas9a

qlvxas9a3#

对于使用sparkSession对象的人,即使使用较新的spark(如3. 2)

# sparkSession
spark = SparkSession.builder.master("local[*]") \
    .appName('sample') \
    .getOrCreate()

# py4j.java_gateway.JavaObject
javaOjbectDf= spark._jvm.com.your.javaPackage.DfBuilder()

sqlContext = SQLContext(sparkContext=spark.sparkContext, sparkSession=spark)
df_from_java = DataFrame(javaOjbectDf, sqlContext)

# python DataFrame
print(df_from_java)

相关问题