Вот решение:
Генерация от 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 и убрать последнее значение.