首页 > 解决方案 > 如何在不注册视图的情况下将 Scala DataFrame 引入 Python,反之亦然?

问题描述

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

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

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

但是我觉得这很难看,因为当我的数据科学家同事“隐藏”时,它可能会导致名称冲突,因为函数每次都需要创建临时表。或者我生成随机表名,但我可能有大量的表在一段时间后不再需要。

那么,是否有类似的功能:

pythonDataFrame = scalaToPythonDataframe(scalaDataFrame)

Python DF 有一个_jdf获取 Java/Scala DF 的字段,因此使用临时视图无法解决问题……或者是这样吗?

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

标签: pythonapache-sparkpysparkpyspark-sql

解决方案


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

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

SQLContextSparkSession通过其字段_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)

推荐阅读