我怎样才能以spark / scala解析此数据文件并将每9行作为一条记录。我需要它们以逗号分隔的方式每9行重写一次。check this image for the data format
答案 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并去除最后一个值。