Scala (Spark) .txt 到 .csv

时间:2021-05-11 13:04:11

标签: scala csv apache-spark txt

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

不起作用!

请帮忙。

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

2 个答案:

答案 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
相关问题