带有 Spark 2.4 的 lineSep 选项

问题描述

linesep 选项是否真的适用于 Spark 2.4 版本。

linesep (default covers all \r,\r\n and \n): defines the line separator that should be used for parsing. Maximum length is 1 character.

我正在将 Dataframe 写入 GCS 存储桶位置,但它始终仅使用行分隔符将其写入 '\n'

df
  .select("COLLECTTIME","SITE","NETWORK")
  .coalesce(1)
  .limit(10)
  .write
  .option("header",false)
  .option("compression","gzip")
  .option("linesep","\r\n")
  .csv(tmpOutput)

我在每行的末尾寻找 CRLF

我也尝试了以下但不起作用

df2.withColumn(df2.columns.last,concat(col(df2.columns.last),lit("\r")))
  .write
  .option("header","gzip")
  .csv(tmpOutput)

我也尝试了下面的方法,但没有成功。

import org.apache.spark.sql.functions._
df2.withColumn(df2.columns.last,regexp_replace(col(df2.columns.last),"[\\r]","[\\r\\n]"))
  .write
  .option("header","gzip")
  .csv(tmpOutput)

现在我想在写入文件后再次从 GCS 读取文件并逐行读取并在每条记录的末尾附加 '\r' 。 Spark 2.4 不是简短而简单的东西。我只需要在每条记录的末尾加上 'CRLF'

读取和更新也是不可能的,因为存储在 gcs 存储桶上的对象是不可变的。我无法将文件保存在缓冲区中,因为它们的大小也稍大

解决方法

我很抱歉,但是 AFAIK,恐怕 Spark 允许您在问题中引用的不同分隔符:

lineSep (default covers all \r,\r\n and \n): defines the line separator that should be used for parsing. Maximum length is 1 character.

只用于阅读,不用于写作;在后一种情况下,\n 是硬编码的,或者,由于 Spark 版本 2.43.0,您可以选择自定义行分隔符,但仅限于单个字符。

请考虑阅读this Github issue,它提供了有关问题的整个背景。 This other one 也有帮助。