Scala (Spark) .txt 到 .csv

Scala (Spark) .txt to .csv

我有 .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 

我无法使用 Spark/Scala 将其翻译成 .csv

  val data = spark
      .read
      .option("header", "true")
      .option("inferSchema","true")
      .csv() /.text /.textfile 

无效!

请帮忙。

这是文件 - https://github.com/CvitoyBamp/overflow

你可以试试

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 个或多个 space 的每个序列替换为恰好 1 个 space,然后尝试将结果解析为 csv,并使用单个 space 作为分隔符。您必须注意的一件事是,当您的一个字段包含一系列多个 space 时,它们也将被替换为单个 space.

希望这对您有所帮助,您的 A.txt 测试文件对我来说很好

首先,照常阅读文件:

val df  = spark.read.csv("A.txt")

从第一行获取 headers 并用索引压缩它们

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 检索索引指示的项目(每个 header 元素中的第二个项目)并为其分配列的名称(每个 [=45= 中的第一个项目) ]元素)

同时删除不需要的列并过滤包含 headers 值的行

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