【问题标题】:Writing dataframe in a csv file is removing leading spaces from string column [duplicate]在 csv 文件中写入数据框正在从字符串列中删除前导空格 [重复]
【发布时间】:2026-02-22 23:05:02
【问题描述】:

假设我有一个 csv 文件:

UserName
"Ali "
"Bilal "
"Ahsan "

当我在 Spark 中阅读时,数据是正确的。

------------
- UserName -
------------
- Ali      -
- Bilal    -
- Ahsan    -

但是当我将其写回 csv 文件时,空格会被删除并且文件有输出

UserName
"Ali"
"Bilal"
"Ahsan"

任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql


    【解决方案1】:

    在编写时,使用选项 ignoreLeadingWhiteSpace 并且 ignoreTrailingWhiteSpace 为真。默认情况下,它们在用 spark 写入 csv 时为 true,在读取时为 false。见:https://spark.apache.org/docs/latest/sql-data-sources-csv.html

    df.write.format("csv").option("ignoreTrailingWhiteSpace",true)..option("ignoreLeadingWhiteSpace",true).save(path)
    

    如果解决了请采纳。

    【讨论】:

    • 谢谢,是的,这是正确的答案。它会在写入时忽略空格。
    • @deo/@Bilal Shafqat - 它适用于 Spark 2.2.0。我确实添加了忽略空格的选项,但它对我不起作用。
    【解决方案2】:

    有一个内置于 sql 函数中的函数。

    scala> import org.apache.spark.sql.functions.trim
    scala> import spark.implicits
    
    scala> val names = Seq(" Ali ", "Bihal ", " Ahsan").toDF("n")
    names: org.apache.spark.sql.DataFrame = [n: string]
    
    scala> names.withColumn("n", trim($"n")).show(1)
    +---+
    |  n|
    +---+
    |Ali|
    +---+
    only showing top 1 row
    
    
    scala> names.withColumn("n", trim($"n")).show
    +-----+
    |    n|
    +-----+
    |  Ali|
    |Bihal|
    |Ahsan|
    +-----+
    

    【讨论】:

    • 感谢您的回复,但这会删除空格,但我不想删除空格,我希望它们保持原样。
    • 哦,对不起,我完全误解了这个问题......也许你可以明确地说“你们能帮我告诉我如何不删除空格。”正如您从响应中看到的那样,我们都从所写的内容中读到。
    • 在数据框中转义引号似乎可以满足您的要求。 val names = Seq(("\" Ali \"", "\"A+\""), ("\"Bihal \"", "\"A-\""), ("\" Ahsan\"" , "\"B+ \"")).toDF("n", "g") \n names.repartition(1).write.mode("overwrite").option("quote", "\"") .option("escape", "\"").csv("./trash")。或者,以更好更快的格式存储它,如镶木地板。 CSV 现在通常只是一个输入步骤,但在摄取之后,大多数内容都保持为 parquet 格式。