首页 > 解决方案 > 将一个数据框中的单个值与另一个数据框中的值映射

问题描述

我有一个包含两列的数据框(DF1)

+--------+------+
|单词 |价值 |
+--------+------+
|ABC |1.0 |
|XYZ |2.0 |
|DEF |3.0 |
|GHI |4.0 |
+--------+------+

和另一个像这样的数据框(DF2)

+------------------------------+
|字符串 |
+------------------------------+
|ABC DEF GHI |
|XYZ ABC 定义 |                
+------------------------------+

我必须用 DF1 中的相应值替换 DF2 中的各个字符串值。例如,在操作之后,我应该取回这个数据帧。

+------------------------------+
|stringToDouble |
+------------------------------+
|1.0 3.0 4.0 |
|2.0 1.0 3.0 |                
+------------------------------+

我尝试了多种方法,但似乎无法找出解决方案。

 def createCorpus(conversationCorpus: Dataset[Row], dataDictionary: Dataset[Row]): Unit = {
 import spark.implicits._

 def getIndex(word: String): Double = {
 val idxRow = dataDictionary.selectExpr("index").where('words.like(word))
 val idx = idxRow.toString
 if (!idx.isEmpty) idx.trim.toDouble else 1.0
 }

 conversationCorpus.map { //eclipse doesnt like this map here.. throws an error..
    r =>
    def row = {
       val arr = r.getString(0).toLowerCase.split(" ")
       val arrList = ArrayBuffer[Double]()
       arr.map {
          str =>
          val index = getIndex(str)
       }
       Row.fromSeq(arrList.toSeq)
       }
       row

   }
 }

标签: scalaapache-sparkdataframespark-dataframe

解决方案


组合多个数据框以创建新列将需要一个 join。通过查看您的两个数据框,我们似乎可以按wordsdf1string列连接,df2string列需要一个explode和组合(这可以通过在爆炸前为每行提供唯一的 ID 来完成)。monotically_increasing_id df2. _ split函数将stringcolumn 转换为 array 以进行 explode。然后你可以join他们。然后剩下的步骤是通过做和聚合将分解的行组合回原始行groupBy

最后收集的数组列可以通过使用udf函数更改为所需的字符串列

长话短说,以下解决方案应该适合您

import org.apache.spark.sql.functions._
def arrayToString = udf((array: Seq[Double])=> array.mkString(" "))

df2.withColumn("rowId", monotonically_increasing_id())
  .withColumn("string", explode(split(col("string"), " ")))
  .join(df1, col("string") === col("words"))
  .groupBy("rowId")
  .agg(collect_list("value").as("stringToDouble"))
  .select(arrayToString(col("stringToDouble")).as("stringToDouble"))

这应该给你

+--------------+
|stringToDouble|
+--------------+
|1.0 3.0 4.0   |
|2.0 1.0 3.0   |
+--------------+

推荐阅读