我在文件中有以下数据:
用户:测试
评论:测试
参考:Test1 Test2 Test3
#####
用户:Test1
评论:Test1
参考:Test2 Test3 Test4
...
现在我要检查的是,哪个用户最常提及的内容。这意味着,“用户”和“参考”之间必须存在关联。当使用以下代码时,每一行成为RDD中的一个元素:
elements = sc.textFile(path_to_file)
此时,不再可能使用诸如map()之类的函数在“ User”和“ References”值之间建立关联,因为RDD的元素被独立对待。
是否可以告诉textFile()函数使用自定义定界符,而不是换行符? (在上述情况下,它将是5#)
对此问题还有其他解决方案吗?
您可以尝试这种方法:
import spark.implicits._
import org.apache.spark.sql.functions._
val r1 = spark.sparkContext.textFile("data/splithash.txt")
val rdd = r1.filter(!_.trim().equals(""))
.filter(!_.equals("#####"))
.zipWithIndex()
.map(s => (s._1, Math.ceil(s._2/3).toInt))
val df = rdd.toDF()
df.show()
df.groupBy('_2).agg(collect_list('_1)).show(false)
+--------------------+---+
| _1| _2|
+--------------------+---+
| User: Test| 0|
| Comment: Test| 0|
|References: Test1...| 0|
| User: Test1| 1|
| Comment: Test1| 1|
|References: Test2...| 1|
+--------------------+---+
+---+------------------------------------------------------------+
|_2 |collect_list(_1) |
+---+------------------------------------------------------------+
|1 |[User: Test1, Comment: Test1, References: Test2 Test3 Test4]|
|0 |[User: Test, Comment: Test, References: Test1 Test2 Test3] |
+---+------------------------------------------------------------+