我有一个用 Scala 编写的库,它有一些函数可以从多种测量数据格式加载数据并进行一些计算。这些函数都在 Scala 版本的 DataFrame
上运行。
我现在想在 PySpark 的 Python 代码中使用这些库。我编写了一些辅助对象(因为我的库在包对象中使用了很多隐式对象)来帮助从 Python 调用这些内容,并且我成功地完成了如下操作:(spark
是 Python SparkSession
)
sdf = spark._jvm.com.mycompany.PyApiFooHelper.loadFooMeasuringData(spark._jsparkSession, "hdfs:///some/where")
sCalcResult = spark._jvm.com.mycompany.PyApiBarCalculationHelper.doBarCalculation(sdf)
当我想要在 Python 中使用 sCalcResult
时,我目前按照 this question, 中的概述进行操作。注册一个临时 View 并将其引入:
sCalcResult.createOrReplaceTempView("sCalcResult")
calcResult = spark._wrapped.table("sCalcResult")
但是我觉得这很难看,因为当我的数据科学家同事“隐藏它”时,它可能会导致名称冲突,因为这些函数每次都需要创建临时表。或者我生成随机表名称,但随后我可能会放置大量的表,一段时间后就不再需要它们了。
那么,有没有这样的函数:
pythonDataFrame = scalaToPythonDataframe(scalaDataFrame)
Python DF 有一个 _jdf
字段来获取 Java/Scala DF,因此使用临时 View 不可能是这样的方式......或者是吗?
编辑:我目前正在使用 Spark 2.3。
最佳答案
我查看了Spark的源代码并找到了解决方案。
一个DataFrame
有一个双参数构造函数,它接受 JVM DF 引用和 SQLContext
,其 Python 变体。
SQLContext
是从 SparkSession
获得的通过其 _wrapped
领域或来自另一个DataFrame
通过其 sql_ctx
字段。
所以,它是这样完成的:
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)
关于python - 如何在不注册 View 的情况下将 Scala DataFrame 引入 Python,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52312543/