在scala中匹配两个数据框
Posted
技术标签:
【中文标题】在scala中匹配两个数据框【英文标题】:Matching two dataframes in scala 【发布时间】:2016-06-29 10:30:24 【问题描述】:我在 SCALA 中有两个 RDD,并将它们转换为数据帧。
现在我有两个数据框。一个prodUniqueDF
有两个名为prodid
和uid
的列,它包含产品的主数据
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中匹配两个数据框的主要内容,如果未能解决你的问题,请参考以下文章