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

标签 python apache-spark pyspark apache-spark-sql

我有一个用 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/

相关文章:

python - 从特定日期时间范围获取数据

python - 使用 Python 和 Pandas 抓取数据

apache-spark - 如何在 Python 中排除 Spark 数据框中的多列

python - 使用python中的公式计算第n个斐波那契数

python - Pandas - 按连续范围分组

apache-spark - 数据管道 - 从网络驱动器读取数据的最佳方法

apache-spark - 我可以在 CDH 中安装多个 spark 版本吗?

python - 如何在spark中读取固定字符长度格式的文件

python - pyspark使用saveAsNewAPIHadoopFile将dstream数据写入es得到警告

mysql - 从 pySpark SQL 获取新行 ID 写入远程 mysql 数据库 (JDBC)