Dataframes join 在 Spark Scala 中返回空结果

Posted

技术标签:

【中文标题】Dataframes join 在 Spark Scala 中返回空结果【英文标题】:Dataframes join returns empty results in Spark Scala 【发布时间】:2018-11-25 22:30:23 【问题描述】:

我在 Spark Scala 中有四个数据框(Spark 版本:2.3 和 Spark-sql:2.11 和 Scala 版本:2.11.0),例如:

评分Df

+-------+---+
|ratings| id|
+-------+---+
|      0|  1|
|      1|  2|
|      1|  3|
|      0|  4|
|      0|  5|
|      1|  6|
|      1|  7|
|      1|  8|
|      0|  9|
|      1| 10|
+-------+---+

GpredictionsDf

+-----------+---+
|gprediction| id|
+-----------+---+
|          0|  1|
|          1|  2|
|          1|  3|
|          1|  4|
|          1|  5|
|          1|  6|
|          1|  7|
|          1|  8|
|          0|  9|
|          1| 10|
+-----------+---+

RpredictionsDf

+-----------+---+
|rprediction| id|
+-----------+---+
|          0|  1|
|          1|  2|
|          1|  3|
|          1|  4|
|          1|  5|
|          1|  6|
|          1|  7|
|          1|  8|
|          1|  9|
|          1| 10|
+-----------+---+

LpredictionsDf

+-----------+---+
|lprediction| id|
+-----------+---+
|          0|  1|
|          1|  2|
|          1|  3|
|          0|  4|
|          1|  5|
|          1|  6|
|          1|  7|
|          1|  8|
|          0|  9|
|          1| 10|
+-----------+---+

我需要通过在“id”列上连接所有四个表来创建一个 DataFrame。我尝试了以下两种方法:

**方法一:**

val ensembleDf = GpredictionsDf.join(rpredjoin, gpredjoin("id") === RpredictionsDf("id"))
                               .join(LpredictionsDf, LpredictionsDf("id") === RpredictionsDf("id"))
                               .join(ratingsDf, ratingsDf("id") === RpredictionsDf("id"))
                               .select("gprediction", "rprediction", "lprediction", "ratings")

**方法二:**

ratingsDf.createOrReplaceTempView("ratingjoin");
GpredictionsDf.createOrReplaceTempView("gpredjoin")
RpredictionsDf.createOrReplaceTempView("rpredjoin")
LpredictionsDf.createOrReplaceTempView("lpredjoin")    


val ensembleDf = sqlContext.sql("SELECT gprediction, rprediction, lprediction, ratings FROM gpredjoin, rpredjoin, lpredjoin, ratingjoin WHERE " +
  "gpredjoin.id = rpredjoin.id AND rpredjoin.id = lpredjoin.id AND lpredjoin.id = ratingjoin.id");

但是,在这两种情况下,我的加入都失败并返回空

ensembleDf.show();

+-----------+-----------+-----------+-------+
|gprediction|rprediction|lprediction|ratings|
+-----------+-----------+-----------+-------+
+-----------+-----------+-----------+-------+

知道为什么会发生这种情况吗?我需要做哪些代码更改才能解决此问题?

【问题讨论】:

能否请您按照How to make good reproducible Apache Spark Dataframe examples 的说明并包括可重现的数据和Spark 版本?谢谢。 我已经相应更新了 包括 rpredjoin 和 gpredjoin 在内的所有这些都只是数据帧。这里没有蜂巢表 您在方法 1 中的连接看起来是正确的,只是临时视图与数据帧混合在一起。用GpredictionsDf.join(RpredictionsDf, GpredictionsDf("id") === RpredictionsDf("id")) 替换GpredictionsDf.join(rpredjoin, gpredjoin("id") === RpredictionsDf("id")) 应该可以解决问题。 我添加了 val ensemble = GpredictionsDf.join(RpredictionsDf, GpredictionsDf("id") === RpredictionsDf("id")) .join(LpredictionsDf, LpredictionsDf("id") === RpredictionsDf ("id")) .join(ratingsDf, ratingsDf("id") === RpredictionsDf("id")) .select("gprediction", "rprediction", "lprediction", "ratings");它仍然显示空数据集 【参考方案1】:
scala> val ratingsDf = Seq((0,1),(1,2),(1,3),(0,4),(0,5),(1,6),(1,7),(1,8),(0,9),(1,10)).toDF("ratings","id")

scala> val GpredictionsDf = Seq((0,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(0,9),(1,10)).toDF("gprediction", "id")

scala> val RpredictionsDf = Seq((0,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(1,10)).toDF("rprediction", "id")

scala> val LpredictionsDf = Seq((0,1),(1,2),(1,3),(0,4),(1,5),(1,6),(1,7),(1,8),(0,9),(1,10)).toDF("lprediction", "id")

scala> val ensembleDf = GpredictionsDf.join(RpredictionsDf, GpredictionsDf("id") === RpredictionsDf("id") ).join(LpredictionsDf, LpredictionsDf("id") === RpredictionsDf("id")).join(ratingsDf, ratingsDf("id") === RpredictionsDf("id")).select("gprediction", "rprediction", "lprediction", "ratings")

scala> ensembleDf.show
    +-----------+-----------+-----------+-------+
    |gprediction|rprediction|lprediction|ratings|
    +-----------+-----------+-----------+-------+
    |          0|          0|          0|      0|
    |          1|          1|          1|      1|
    |          1|          1|          1|      1|
    |          1|          1|          0|      0|
    |          1|          1|          1|      0|
    |          1|          1|          1|      1|
    |          1|          1|          1|      1|
    |          1|          1|          1|      1|
    |          0|          1|          0|      0|
    |          1|          1|          1|      1|
    +-----------+-----------+-----------+-------+

这是我尝试过的,它给出了正确的值。我建议您检查您用于加入的 DF。

【讨论】:

以上是关于Dataframes join 在 Spark Scala 中返回空结果的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark 中加入数据框

在 Spark RDD 和/或 Spark DataFrames 中重塑/透视数据

在 Spark RDD 和/或 Spark DataFrames 中重塑/透视数据

如何在 spark dataframes/spark sql 中使用模式读取 json

Spark 结合了 DataFrames 和 GraphX

使用 Spark DataFrames 在特定时间范围内获取唯一计数