我的文件中包含以下数据:
用户:测试
评论:测试
参考文献:Test1 Test2 Test3
#####
用户:Test1
评论:Test1
参考文献:Test2 Test3 Test4
...
现在,我要检查的是,哪个用户最常提及的内容。这意味着,“用户”和“参考”之间必须存在关联。 使用以下代码时,每一行成为RDD中的一个元素:
elements = sc.textFile(path_to_file)
在这一点上,由于RDD的元素是独立处理的,因此不再可能使用诸如map()之类的函数在“用户”和“引用”值之间建立关联。
是否可以告诉textFile()函数使用自定义分隔符,而不是换行符? (在上述情况下为5#)
还有其他解决方案吗?
答案 0 :(得分:1)
您可以尝试这种方法。读为rdd,过滤出空白行和5#分隔符,然后添加索引进行分组,转换为DF,groupBy,并且用户和引用位于一行中。
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] |
+---+------------------------------------------------------------+
import pyspark.sql.functions as f
import math
r1 = spark.sparkContext.textFile("ok.txt")
rdd = r1.filter(lambda x: x.strip() != '') \
.filter(lambda x: x != '#####') \
.zipWithIndex() \
.map(lambda x: (x[0], math.floor(x[1] / 3)))
rdd.foreach(lambda x: print(x))
df = rdd.toDF()
df.show()
df.groupBy(f.col('_2')).agg(f.collect_list(f.col('_1'))).show(truncate=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) |
+---+------------------------------------------------------------+
|0 |[User: Test, Comment: Test, References: Test1 Test2 Test3] |
|1 |[User: Test1, Comment: Test1, References: Test2 Test3 Test4]|
+---+------------------------------------------------------------+