如何在不注册视图的情况下将 Scala DataFrame 引入 Python,反之亦然?



我有一个用 Scala 编写的库,它有一些函数,用于从多种测量数据格式加载数据并进行一些计算。这些函数都在 Scala 版本的DataFrame上运行。

我现在想在 Python 代码中通过 PySpark 使用这些库。我写了一些辅助对象(因为我的库在包对象中使用了很多隐式(来帮助从 Python 调用这些东西,我成功地做到了这样的事情:(spark是 PythonSparkSession(

sdf = spark._jvm.com.mycompany.PyApiFooHelper.loadFooMeasuringData(spark._jsparkSession, "hdfs:///some/where")
sCalcResult = spark._jvm.com.mycompany.PyApiBarCalculationHelper.doBarCalculation(sdf)

当我想在 Python 中sCalcResult时,我目前按照这个问题中的概述进行操作,注册一个临时视图并将其引入:

sCalcResult.createOrReplaceTempView("sCalcResult")
calcResult = spark._wrapped.table("sCalcResult")

然而,我觉得这很丑陋,因为它可能会导致名称冲突,因为它可能会导致名称冲突,因为函数每次都需要创建临时表。或者我生成随机表名,但随后我可能会有大量

的表,一段时间后不再需要这些表。那么,有没有这样的函数:

pythonDataFrame = scalaToPythonDataframe(scalaDataFrame)

Python DF 有一个_jdf字段来获取 Java/Scala DF,所以使用临时视图不能成为一种方式......还是吗?

编辑:我目前正在使用Spark 2.3。

我查看了Spark的源代码并找到了解决方案。

DataFrame有一个双参数构造函数,它接受一个JVM DF引用和一个SQLContext,在其Python变体中。

SQLContext通过其_wrapped场从SparkSession获得,或通过其sql_ctx场从另一个DataFrame获得。

所以,它是这样完成的:

from pyspark.sql import DataFrame
# Use Spark DataSource API instead of explicit method
df = spark.read.format("com.mycompany.formats.foo").load("hdfs:///some/where")
sCalcResult = spark._jvm.com.mycompany.PyApiBarCalculationHelper.doBarCalculation(df._jdf)
barCalcResult = DataFrame(sCalcResult, spark._wrapped)

最新更新