使用Apache Spark Scala API写入DataFrame到CSV时,如何从第二行开始写入?
实现CSV从第二行开始写入的两种场景方案
针对你遇到的Spark写入CSV时想从第二行开始写入的需求,我分两种常见场景给你具体的解决办法:
场景1:往已有表头的CSV文件追加数据(保留原表头,新数据从第二行开始)
如果你的目标是给已经存在的、第一行是表头的CSV文件追加数据,不想覆盖原有表头,只需要在写入时关闭表头输出并使用追加模式即可:
// 假设你的DataFrame已经是不带表头的纯数据 df.write.format("com.databricks.spark.csv") .option("header", "false") // 禁止写入表头,避免重复生成 .mode("append") // 启用追加模式,不会覆盖原文件内容 .save("file.csv")
注意:如果是第一次创建这个CSV文件,你需要先单独写入表头;之后每次追加数据都用上面的代码,就能保证新数据从第二行(及以后)开始写入。
场景2:生成全新CSV,第一行留空、数据从第二行开始
如果要生成一个全新的CSV文件,第一行为空行,数据从第二行开始展示,你可以先创建一个空行的DataFrame,再和你的业务数据合并后写入:
import org.apache.spark.sql.Row import org.apache.spark.sql.types.StructType // 创建和你的业务DataFrame结构一致的空行 val emptyRow = Row.fromSeq(df.columns.map(_ => "")) val emptyDF = spark.createDataFrame(spark.sparkContext.parallelize(Seq(emptyRow)), df.schema) // 合并空行和业务数据,再写入文件 emptyDF.union(df) .write.format("com.databricks.spark.csv") .option("header", "false") // 不需要表头的话设为false,需要的话根据需求调整 .mode("overwrite") .save("file.csv")
额外提示:生成单个CSV文件
Spark默认会按分区生成多个part-xxx.csv文件,如果需要生成单个完整的CSV文件,可以先将DataFrame合并为一个分区再写入:
df.coalesce(1) // 合并为单个分区 .write.format("com.databricks.spark.csv") .option("header", "false") .mode("append") .save("temp_output") // 之后你可以手动将temp_output目录下的part文件重命名为file.csv即可
内容的提问来源于stack exchange,提问作者user2432062
相关产品推荐
相关产品推荐

