Spark (Scala) 如何通过"key"访问数据帧中的特定行并对其进行修改



我有两个数据帧,其中一个看起来像

+------------------------------------------------------------+
|docs                                                        |
+------------------------------------------------------------+
|{doc1.txt -> 1, doc2.txt -> 3, doc3.txt -> 5, doc4.txt -> 1}|
|{doc1.txt -> 2, doc2.txt -> 2, doc3.txt -> 4}               |
|{doc1.txt -> 3, doc2.txt -> 2, doc4.txt -> 2}               |
+------------------------------------------------------------+

另一种类似

+--------------+----------+
|      Document|doc_length|
+--------------+----------+
|      doc1.txt|         0|
|      doc2.txt|         0|
|      doc3.txt|         0|
|      doc3.txt|         0|
|      doc4.txt|         0|
+-------------------------+

例如,文档是有序的,但在我的用例中,我不能指望它们是有序的。

现在,我想遍历第一个数据帧,并在进行时更新第二个数据帧中的值。我有一个像这样的循环

df1.foreach(r =>
for (keyValPair <- r(0).asInstanceOf[Map[String, Long]]) {
// Something needs to happen here
} )

在每次迭代中,我都想取键值对的键来选择第二个数据帧中的特定行,然后将该值添加到doc_length中,因此df2.show()的最终输出看起来如下编辑:稍后,我可能想在这里进行其他更复杂的数学运算,然后将所有值相加,这就是为什么我试图使用上面描述的结构

+--------------+----------+
|      Document|doc_length|
+--------------+----------+
|      doc1.txt|         6|
|      doc2.txt|         7|
|      doc3.txt|         9|
|      doc4.txt|         0|
+-------------------------+

这看起来不太难,但我不知道如何通过使用特定列作为键来访问数据帧的特定行,并将其更改为

您可以按键分解映射列和组以总结长度:

val df2 = df.select(explode(col("val")))
.groupBy(col("key").as("document"))
.agg(sum("value").as("doc_length"))
df2.show
+--------+----------+
|document|doc_length|
+--------+----------+
|doc1.txt|         6|
|doc4.txt|         3|
|doc3.txt|         9|
|doc2.txt|         7|
+--------+----------+

最新更新