问题描述
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.4
和 3.0
,您可以选择自定义行分隔符,但仅限于单个字符。
请考虑阅读this Github issue,它提供了有关问题的整个背景。 This other one 也有帮助。