如何在spark textFile函数中使用自定义换行符?

时间:2019-10-16 14:55:16

标签: python apache-spark pyspark

我的文件中包含以下数据:

  

用户:测试

     

评论:测试

     

参考文献:Test1 Test2 Test3

     

#####

     

用户:Test1

     

评论:Test1

     

参考文献:Test2 Test3 Test4

     

...

现在,我要检查的是,哪个用户最常提及的内容。这意味着,“用户”和“参考”之间必须存在关联。 使用以下代码时,每一行成为RDD中的一个元素:

elements = sc.textFile(path_to_file)

在这一点上,由于RDD的元素是独立处理的,因此不再可能使用诸如map()之类的函数在“用户”和“引用”值之间建立关联。

是否可以告诉textFile()函数使用自定义分隔符,而不是换行符? (在上述情况下为5#)

还有其他解决方案吗?

1 个答案:

答案 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]|
+---+------------------------------------------------------------+