如何在读取文本文件spark / scala RDD时将每9行文件作为一条记录

时间:2018-10-26 15:30:29

标签: scala apache-spark

我怎样才能以spark / scala解析此数据文件并将每9行作为一条记录。我需要它们以逗号分隔的方式每9行重写一次。check this image for the data format

1 个答案:

答案 0 :(得分:0)

这是解决方案:

从RDD生成到DF,然后如下所示进行处理。

g是组,k是记录在g中重复的数字的键。 v是您的记录内容。以某种方式跳过空条目。我把钥匙留了进去,你可以把它剥掉。

输入是一个6行的文件,我使用了3组。您可以将其更改为9并执行write.df;。我已经完成了繁重的工作。

然后应用此逻辑并重命名各列:

import org.apache.spark.sql.functions._
import org.apache.spark.mllib.rdd.RDDFunctions._

val dfsFilename = "/FileStore/tables/7dxa9btd1477497663691/Text_File_01-880f5.txt"
val readFileRDD = spark.sparkContext.textFile(dfsFilename)
val rdd2 = readFileRDD.sliding(3,3).zipWithIndex
val rdd3 = rdd2.map(r => (r._1.zipWithIndex, r._2))
val df = rdd3.toDF("vk","g")

val df2 = df.withColumn("vke", explode($"vk")).drop("vk")
val df3 = df2.withColumn("k", $"vke._2").withColumn("v", $"vke._1").drop("vke")

val result = df3
            .groupBy("g")
            .pivot("k")
            .agg(expr("first(v)"))

result.show()

返回:

+---+--------------------+--------------------+--------------------+
|  g|                   0|                   1|                   2|
+---+--------------------+--------------------+--------------------+
|  0|The quick brown f...|Here he lays I te...|Gone are the days...|
|  1|  Gosh, what to say.|Hallo, hallo, how...|          I am fine.|
+---+--------------------+--------------------+--------------------+

您可以对9,10使用滑动。

此外,还有以下方法:

val rdd = readFileRDD.coalesce(1).mapPartitions(_.grouped(n))

但是您必须合并为1,然后每隔十分之一处理一次跳过记录。可以将n设置为10并去除最后一个值。