希望这有帮助,你的 A.txt 测试文件对我来说很好
首先,照常读取文件:
val df = spark.read.csv("A.txt")
从第一行获取标题并用索引压缩它们
val headers = df.first.toSeq.asInstanceOf[Seq[String]].flatMap(_.split("\\s+")).zipWithIndex
结果
headers: Seq[(String, Int)] = ArrayBuffer((Number,0), (Date,1), (Time,2), (Nns,3), (Ans,4), (Nwe,5), (Awe,6))
然后折叠标题,检索由索引指示的项目(每个标题元素中的第二项)并为其分配列的名称(每个标题元素中的第一项)
同时删除不需要的列并过滤包含标题值的行
headers.foldLeft(df.withColumn("tmp", split($"_c0", "\\s+")))
((acc, elem) => acc.withColumn(elem._1, $"tmp".getItem(elem._2)))
.drop("_c0", "tmp")
.filter("Number <> 'Number'")
结果
+------+--------+--------+-----+----+----+----+
|Number| Date| Time| Nns| Ans| Nwe| Awe|
+------+--------+--------+-----+----+----+----+
| 1|22.07.17|08:00:23|12444| 427|8183| 252|
| 2|22.07.17|08:00:24| 13| 312| 9| 278|
| 3|22.07.17|08:00:25| 162|1877| 63| 273|
| 4|22.07.17|08:00:26| 87| 400| 29| 574|
| 5|22.07.17|08:00:27| 72| 349| 82|2047|
| 6|22.07.17|08:00:28| 79| 294| 63| 251|
| 7|22.07.17|08:00:29| 35| 318| 25| 248|
| 8|22.07.17|08:00:30| 10| 629| 12| 391|
| 9|22.07.17|08:00:31| 58| 511| 67| 525|
| 10|22.07.17|08:00:32| 72| 234| 29| 345|
| 11|22.07.17|08:00:33| 277|1181| 38| 250|
| 12|22.07.17|08:00:34| 40| 268| 31| 292|
| 13|22.07.17|08:00:35| 16| 523| 10| 368|
| 14|22.07.17|08:00:36| 319|1329| 143| 703|
| 15|22.07.17|08:00:37| 164| 311| 124| 352|
| 16|22.07.17|08:00:38| 62| 320| 116| 272|
| 17|22.07.17|08:00:39| 223| 356| 217|1630|
| 18|22.07.17|08:00:40| 50|1659| 94|1611|
| 19|22.07.17|08:00:41| 34| 431| 26| 587|
| 20|22.07.17|08:00:42| 0| 0| 5| 277|
+------+--------+--------+-----+----+----+----+
only showing top 20 rows
另外,一个接近另一个答案的解决方案
您可以将数据加载为字符串数据集
val stringDF = spark.read.textFile("Downloads/A.txt").map(_.replaceAll("\\s+", " "))
然后
val data = spark
.read
.option("header", true)
.option("sep", " ")
.option("inferSchema", true)
.csv(cleaned)
.drop("_c7")
结果
+------+--------+--------+-----+----+----+----+
|Number| Date| Time| Nns| Ans| Nwe| Awe|
+------+--------+--------+-----+----+----+----+
| 1|22.07.17|08:00:23|12444| 427|8183| 252|
| 2|22.07.17|08:00:24| 13| 312| 9| 278|
| 3|22.07.17|08:00:25| 162|1877| 63| 273|
| 4|22.07.17|08:00:26| 87| 400| 29| 574|
| 5|22.07.17|08:00:27| 72| 349| 82|2047|
| 6|22.07.17|08:00:28| 79| 294| 63| 251|
| 7|22.07.17|08:00:29| 35| 318| 25| 248|
| 8|22.07.17|08:00:30| 10| 629| 12| 391|
| 9|22.07.17|08:00:31| 58| 511| 67| 525|
| 10|22.07.17|08:00:32| 72| 234| 29| 345|
| 11|22.07.17|08:00:33| 277|1181| 38| 250|
| 12|22.07.17|08:00:34| 40| 268| 31| 292|
| 13|22.07.17|08:00:35| 16| 523| 10| 368|
| 14|22.07.17|08:00:36| 319|1329| 143| 703|
| 15|22.07.17|08:00:37| 164| 311| 124| 352|
| 16|22.07.17|08:00:38| 62| 320| 116| 272|
| 17|22.07.17|08:00:39| 223| 356| 217|1630|
| 18|22.07.17|08:00:40| 50|1659| 94|1611|
| 19|22.07.17|08:00:41| 34| 431| 26| 587|
| 20|22.07.17|08:00:42| 0| 0| 5| 277|
+------+--------+--------+-----+----+----+----+
only showing top 20 rows