在Scala Spark和PySpark之间传递多个DataFrame

时间:2019-05-16 16:48:34

标签: python scala apache-spark pyspark jvm

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

我试图通过从scala spark传递到pyspark来打印一个数据帧。它甚至可以将其转换为熊猫,它的工作原理非常完美。当我通过传递两个数据框进行相同操作时,我无法拆分数据框。我收到的数据类型为“ py4j.java_gateway.JavaMember”,如果我可以拆分它们,则该对象中有两个数据框,我将能够像处理一个scala数据框一样转换pyspark数据框

这是scala代码

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)都转换为pyspark数据帧,分别为df1和df2。

现在我正在获取无法处理的对象py4j.java_gateway.JavaMember。

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

1 个答案:

答案 0 :(得分:1)

您返回的对象是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)