scala - 将一个数据框中的单个值与另一个数据框中的值映射
问题描述
我有一个包含两列的数据框(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
}
}
解决方案
组合多个数据框以创建新列将需要一个 join。通过查看您的两个数据框,我们似乎可以按words
列df1
和string
列连接,df2
但string
列需要一个explode
和组合(这可以通过在爆炸前为每行提供唯一的 ID 来完成)。monotically_increasing_id
为df2
. _ split
函数将string
column 转换为 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 |
+--------------+
推荐阅读
- u-boot - 更换以太网物理层:对 Devicetree 和 uboot 的影响
- python - 如何从我在 Python Tkinter 中生成的条目表中获取数据?
- postgresql - pg_trgm 相似度的计算
- android - registerForActivityResult 是否能够作为 ACTION_CHOOSER
- node-html-pdf - 我想打一个 API,它应该采用 HTML 字符串并下载一个 pdf 文件。使用 nodejs
- kubernetes - 在 Pod 上挂载外部 NFS 共享并拒绝访问文件
- python - python中从1到n的素数
- python-3.x - 如何将 django-allauth 用户与自定义用户模型连接
- javascript - 如何在 javascript/jquery 中为“24 小时”时间格式添加一小时?
- python - Iterating over folder to get csv files and merge them to separate sheets in excel