在scala中匹配两个数据框

Posted

技术标签:

【中文标题】在scala中匹配两个数据框【英文标题】:Matching two dataframes in scala 【发布时间】:2016-06-29 10:30:24 【问题描述】:

我在 SCALA 中有两个 RDD,并将它们转换为数据帧。 现在我有两个数据框。一个prodUniqueDF 有两个名为prodiduid 的列,它包含产品的主数据

scala> prodUniqueDF.printSchema
root
 |-- prodid: string (nullable = true)
 |-- uid: long (nullable = false)

第二,ratingsDF,我有名为prodid,custid,ratings的列

scala> ratingsDF.printSchema
root
|-- prodid: string (nullable = true)
|-- custid: string (nullable = true)
|-- ratings: integer (nullable = false)

我想加入以上两个,将ratingsDF中的ratingsDF.prodid替换为prodUniqueDF.uid

为此,我首先将它们注册为“tempTables”

prodUniqueDF.registerTempTable("prodUniqueDF")
ratingsDF.registerTempTable("ratingsDF")

然后我运行代码

val testSql = sql("SELECT prodUniqueDF.uid, ratingsDF.custid, ratingsDF.ratings FROM prodUniqueDF, ratingsDF WHERE prodUniqueDF.prodid = ratingsDF.prodid")

但错误是:

org.apache.spark.sql.AnalysisException: Table not found: prodUniqueDF; line 1 pos 66

请帮忙!我怎样才能实现加入?是否有另一种方法来映射 RDD?

【问题讨论】:

我的 DataFrame 知识不是很好,但是 Dataframe 上有一个 join 方法可以提供帮助吗? 【参考方案1】:

DataFrame 的 Joining 很容易实现, 格式是

 DataFrameA.join(DataFrameB)

默认情况下,它需要一个内部连接,但您也可以指定您想要执行的连接类型,并且他们有用于该连接的 APi 您可以在这里查看更多信息。

http://spark.apache.org/docs/latest/api/scala/#org.apache.spark.sql.DataFrame

要替换现有列中的值,您可以借助 API 中的 withColumn 方法

应该是这样的:

 val newDF = dfA.withColumn("newColumnName", dfB("columnName"))).drop("columnName").withColumnRenamed("newColumnName", "columnName")

我认为这可能会奏效!

【讨论】:

谢谢@Shivansh。我已经尝试过加入 RDD(不确定join 是否会在 DF 中正常工作)。但似乎有问题用新值替换现有列。 任何详细的例子都会有帮助! 我已经更新了答案,请看一下。我希望你能找到你需要的所有帮助! 如果它解决了您的答案@suvojyotic,请接受并投票! :)

以上是关于在scala中匹配两个数据框的主要内容,如果未能解决你的问题,请参考以下文章

使用数据框的子集和 spark/scala 中的两个特定字段过滤数据框 [关闭]

在 Spark scala 中更新数据框的最佳方法

Scala:如何组合两个数据框?

高级连接两个数据框 spark scala

Spark 中的数据框比较:Scala

字符串列包含通过 spark scala 精确匹配的单词