我有 .txt
和 .dat
文件的结构:
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
我无法使用 .csv
将其翻译成 Spark/Scala
。
val data = spark
.read
.option("header", "true")
.option("inferSchema","true")
.csv() /.text /.textfile
不起作用!
请帮忙。
答案 0 :(得分:1)
你可以试试
val text = spark.read.textFile(pathToFile)
val cleaned = text.map(_.replaceAll(" +", " ").trim)
val data = spark
.read
.option("header", true)
.option("sep", " ")
.option("inferSchema", true)
.csv(cleaned)
它首先将文件作为简单的字符串逐行读取。然后它用恰好 1 个空格替换 1 个或多个空格的每个序列,然后尝试将结果解析为 csv,并使用单个空格作为分隔符。您必须注意的一件事是,当您的某个字段包含一系列多个空格时,它们也会被单个空格替换。
答案 1 :(得分:0)
希望这有帮助,你的 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))
然后 foldLeft 标题检索索引指示的项目(每个标题元素中的第二个项目)并为其分配列的名称(每个标题元素中的第一个项目)
同时删除不需要的列并过滤包含标题值的行
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