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

2024-09-28 01:57:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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

现在我想在PySpark中使用Python代码中的这些库。我写了一些helper对象(因为我的库在package对象中使用了很多隐式函数)来帮助从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时,我目前按照this question,中所述的方法进行操作:注册一个临时视图并将其引入:

^{pr2}$

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

那么,有没有类似的函数:

pythonDataFrame = scalaToPythonDataframe(scalaDataFrame)

pythondf有一个_jdf字段来获取Java/Scala数据源,因此使用临时视图进行修改不是一种方法。。。还是真的?在

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


Tags: 数据对象方法函数版本com视图dataframe
1条回答
网友
1楼 · 发布于 2024-09-28 01:57:43

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

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

SQLContext通过其_wrapped字段从SparkSession获得,或从另一个{}通过其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)

相关问题 更多 >

    热门问题