我有两个数据帧,其中一个看起来像
+------------------------------------------------------------+
|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|
+--------+----------+