【问题标题】:Scala (Spark) .txt to .csvScala (Spark) .txt 到 .csv
【发布时间】:2021-08-01 20:33:10
【问题描述】:

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

【问题讨论】:

  • 我也尝试过使用 .trim 或 .replaceAll 空格。
  • 你遇到了什么异常?
  • 您可能必须配置字段分隔符。查看csv method的文档
  • 你不需要火花。只需使用 sed 之类的东西用逗号替换空格
  • 我希望有类似 EXCEL 的表格

标签: scala csv apache-spark txt


【解决方案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,并以单个空格作为分隔符。您必须注意的一件事是,当您的某个字段包含一系列多个空格时,它们也将被单个空格替换。

【讨论】:

  • 感谢您的帮助!但它也不起作用 =( Spark 创建 Null 值。i.stack.imgur.com/gwj8I.png
  • @Cvitoybamp 当我将trim 添加到清理步骤时,您发布的示例中不再有空值。您是否使用了替换全部?此外,您的实际文件似乎包含一个额外的未命名字段。
  • 对不起,我的坏。非常感谢您解决此案!我整天都在为 .replaceAll .trim .split 苦苦挣扎 真的很感激!
【解决方案2】:

希望这有帮助,你的 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

【讨论】:

  • 非常感谢您解决此案!我整天都在为 .replaceAll .trim .split 苦苦挣扎 真的很感激!
  • 很高兴为您提供帮助。请接受答案,以便有相同问题的任何人都可以轻松找到它
猜你喜欢
  • 2018-03-11
  • 1970-01-01
  • 2016-09-28
  • 2015-10-22
  • 2018-03-18
  • 1970-01-01
  • 2019-12-08
  • 2015-12-16
  • 1970-01-01
相关资源
最近更新 更多