使用rlike with list创建新的df scala

b1uwtaje  于 2021-07-14  发布在  Spark
关注(0)|答案(1)|浏览(328)

两天前刚从scala开始。
事情是这样的,我有一个df和一个列表。df包含两列:段落和作者,列表包含单词(字符串)。我需要计算出每一个单词出现的段落数。
到目前为止,我的想法是在列表上创建一个for循环,使用rlike查询df并创建一个新的df,但是即使这样做有效,我也不知道如何做。感谢您的帮助!
编辑:添加示例数据和预期输出

// Example df and list
val df = Seq(("auth1", "some text word1"), ("auth2","some text word2"),("auth3", "more text word1").toDF("a","t")

df.show

+-------+---------------+
|      a|              t|
+-------+---------------+
|auth1  |some text word1|
|auth2  |some text word2|
|auth1  |more text word1|
+-------+---------------+

val list = List("word1", "word2")

// Expected output

 newDF.show

+-------+-----+----------+
|   word|    a|text count|
+-------+-----+----------+
|word1  |auth1|         2|
|word2  |auth2|         1|
+-------+-----+----------+
jogvjijk

jogvjijk1#

您可以对列表中的每个单词进行筛选和聚合,并使用 unionAll :

val result = list.map(word => 
    df.filter(df("t").rlike(s"\\b${word}\\b"))
      .groupBy("a")
      .agg(lit(word).as("word"), count(lit(1)).as("text count"))
).reduce(_ unionAll _)

result.show
+-----+-----+----------+
|    a| word|text count|
+-----+-----+----------+
|auth3|word1|         1|
|auth1|word1|         1|
|auth2|word2|         1|
+-----+-----+----------+

相关问题