python - 如何在不注册视图的情况下将 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。
解决方案
我查看了 Spark 的源代码并找到了解决方案。
ADataFrame
有一个双参数构造函数,它SQLContext
在其 Python 变体中采用 JVM DF 引用和一个 , 。
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)
推荐阅读
- r - 以闪亮的方式存储和更新数据
- javascript - 将乐谱数据保存在文本文件中
- javascript - 如何使用 PHP str_replace 处理条件
- blazor - 单击浏览器的刷新按钮时如何调用方法?
- amazon-web-services - 无法跨账户使用 Lambda 将 ACM 公共证书附加到 ALB 侦听器
- java - 使用java8将列表转换为地图
- python-3.x - 从 keras 到 pytorch 的自定义层
- electron - Electron:如何获取 webContents(检查 backgroundThrottling)?
- amazon-web-services - 使用无服务器框架将 AWS WAF 与 API 网关相关联
- javascript - 旋转轮在 Html 和 JS 中添加组件