首页 > 解决方案 > 在 Scala Spark 和 PySpark 之间传递多个 DataFrame

问题描述

我正在尝试将多个数据帧从 scala 传递和转换为 pyspark。当我为一个数据帧尝试它时,我可以使用 .show() 读取输出,但对于多个数据帧,我无法拆分数据帧,因此无法转换

我试图通过从 scala spark 传递到 pyspark 来打印一个数据帧。它工作得很好,我什至可以将它转换为熊猫。当我通过传递两个数据帧来做同样的事情时,我无法拆分数据帧。我以“py4j.java_gateway.JavaMember”类型接收数据,如果我可以拆分它们,此对象中有两个数据帧,我将能够像使用一个 scala 数据帧一样转换 pyspark 数据帧

这是斯卡拉代码

import org.apache.spark.SparkContext
import org.apache.spark.sql.{SparkSession, DataFrame}

object scala_py{
def getInputDF:(DataFrame,DataFrame)={

val spark = SparkSession.builder.getOrCreate()
import spark.implicits._
val SourceTableDataframe = spark.sql("select * from <table name>")
val data=spark.sql("SELECT * FROM <table name>")
return (SourceTableDataframe,data)
}}

这是 pyspark 代码:

from pyspark import StorageLevel, SparkFiles
from pyspark.sql import SparkSession, DataFrame, SQLContext
from pyspark.sql.types import *
from pyspark.sql.functions import udf

spark = SparkSession \
    .builder \
    .appName("PySpark using Scala example") \
    .getOrCreate()
sqlContext = spark._wrapped
sc = spark._sc
scala_out=sc._jvm.com.accenture.asset.scala_py

df1,df2=scala_out.getInputDF()
df=DataFrame(df1,sqlContext)

我希望将我的 scala 数据帧(SourceTableDataframe,data)都作为 df1 和 df2 转换为 pyspark 数据帧。

现在我得到了我无法处理的对象 py4j.java_gateway.JavaMember。

当我返回一个数据帧时,我得到了相同的数据类型,但我能够将其转换为 pyspark 数据帧,当我尝试返回两个时,我无法得到我需要的

标签: pythonscalaapache-sparkpysparkjvm

解决方案


您返回的对象是 a scala.Tuple2,相当于:

dfs = sc._jvm.scala.Tuple2(spark._jsparkSession.range(1), spark._jsparkSession.range(2))

它没有 py4j 映射。因此,您必须手动处理它

df1, df2 = DataFrame(dfs._1(), sqlContext), DataFrame(dfs._2(), sqlContext)

推荐阅读