添加自定义分隔符在最终的 spark 数据帧 CSV 输出中添加双引号
Adding custom Delimiter adds double quotes in the final spark data frame CSV outpu
我有一个数据框,我正在用 |^|
替换默认分隔符 ,
。
它工作正常,我也得到了预期的结果,除了在记录中找到 ,
的地方。
例如我有一个这样的记录如下
4295859078|^|914|^|INC|^|Balancing Item - Non Operating Income/(Expense),net|^||^||^|IIII|^|False|^||^||^||^||^|False|^||^||^||^||^|505096|^|505074|^|505074|^|505096|^|505096|^||^|505074|^|True|^||^|3014960|^||^|I|!|
所以第4个字段有,
。
现在我这样做是为了替换 ,
val dfMainOutputFinal = dfMainOutput.na.fill("").select($"DataPartition", $"StatementTypeCode",concat_ws("|^|", dfMainOutput.schema.fieldNames.filter(_ != "DataPartition").map(c => col(c)): _*).as("concatenated"))
val headerColumn = df.columns.filter(v => (!v.contains("^") && !v.contains("_c"))).toSeq
val header = headerColumn.dropRight(1).mkString("", "|^|", "|!|")
val dfMainOutputFinalWithoutNull = dfMainOutputFinal.withColumn("concatenated", regexp_replace(col("concatenated"), "null", "")).withColumnRenamed("concatenated", header)
dfMainOutputFinalWithoutNull.repartition(1).write.partitionBy("DataPartition","StatementTypeCode")
.format("csv")
.option("nullValue", "")
.option("header", "true")
.option("codec", "gzip")
.save("s3://trfsmallfffile/FinancialLineItem/output")
我在保存的输出部分文件中得到这样的输出
"4295859078|^|914|^|INC|^|Balancing Item - Non Operating Income/(Expense),net|^||^||^|IIII|^|false|^||^||^||^||^|false|^||^||^||^||^|505096|^|505074|^|505074|^|505096|^|505096|^||^|505074|^|true|^||^|3014960|^||^|I|!|"
我的问题是 " "
在结果的开头和结尾。
如果删除逗号,我会得到如下所示的正确结果
4295859078|^|914|^|INC|^|Balancing Item - Non Operating Income/(Expense)net|^||^||^|IIII|^|false|^||^||^||^||^|false|^||^||^||^||^|505096|^|505074|^|505074|^|505096|^|505096|^||^|505074|^|true|^||^|3014960|^||^|I|!|
这是标准的 CSV 功能。如果实际数据中出现分隔符(称为 Delimiter Collision),则该字段用引号引起来。
你可以试试
df.write.option("delimiter" , somechar)
其中 somechar
应该是您的数据中未出现的字符。
编辑:
更可靠的解决方案是完全禁用 quoteMode
,因为您正在编写只有一列的数据框。
dfMainOutputFinalWithoutNull.repartition(1)
.write.partitionBy("DataPartition","StatementTypeCode")
.format("csv")
.option("nullValue", "")
.option("quoteMode", "NONE")
//.option("delimiter", ";") // assuming `;` is not present in data
.option("header", "true")
.option("codec", "gzip")
.save("s3://trfsmallfffile/FinancialLineItem/output")
我有一个数据框,我正在用 |^|
替换默认分隔符 ,
。
它工作正常,我也得到了预期的结果,除了在记录中找到 ,
的地方。
例如我有一个这样的记录如下
4295859078|^|914|^|INC|^|Balancing Item - Non Operating Income/(Expense),net|^||^||^|IIII|^|False|^||^||^||^||^|False|^||^||^||^||^|505096|^|505074|^|505074|^|505096|^|505096|^||^|505074|^|True|^||^|3014960|^||^|I|!|
所以第4个字段有,
。
现在我这样做是为了替换 ,
val dfMainOutputFinal = dfMainOutput.na.fill("").select($"DataPartition", $"StatementTypeCode",concat_ws("|^|", dfMainOutput.schema.fieldNames.filter(_ != "DataPartition").map(c => col(c)): _*).as("concatenated"))
val headerColumn = df.columns.filter(v => (!v.contains("^") && !v.contains("_c"))).toSeq
val header = headerColumn.dropRight(1).mkString("", "|^|", "|!|")
val dfMainOutputFinalWithoutNull = dfMainOutputFinal.withColumn("concatenated", regexp_replace(col("concatenated"), "null", "")).withColumnRenamed("concatenated", header)
dfMainOutputFinalWithoutNull.repartition(1).write.partitionBy("DataPartition","StatementTypeCode")
.format("csv")
.option("nullValue", "")
.option("header", "true")
.option("codec", "gzip")
.save("s3://trfsmallfffile/FinancialLineItem/output")
我在保存的输出部分文件中得到这样的输出
"4295859078|^|914|^|INC|^|Balancing Item - Non Operating Income/(Expense),net|^||^||^|IIII|^|false|^||^||^||^||^|false|^||^||^||^||^|505096|^|505074|^|505074|^|505096|^|505096|^||^|505074|^|true|^||^|3014960|^||^|I|!|"
我的问题是 " "
在结果的开头和结尾。
如果删除逗号,我会得到如下所示的正确结果
4295859078|^|914|^|INC|^|Balancing Item - Non Operating Income/(Expense)net|^||^||^|IIII|^|false|^||^||^||^||^|false|^||^||^||^||^|505096|^|505074|^|505074|^|505096|^|505096|^||^|505074|^|true|^||^|3014960|^||^|I|!|
这是标准的 CSV 功能。如果实际数据中出现分隔符(称为 Delimiter Collision),则该字段用引号引起来。
你可以试试
df.write.option("delimiter" , somechar)
其中 somechar
应该是您的数据中未出现的字符。
编辑:
更可靠的解决方案是完全禁用 quoteMode
,因为您正在编写只有一列的数据框。
dfMainOutputFinalWithoutNull.repartition(1)
.write.partitionBy("DataPartition","StatementTypeCode")
.format("csv")
.option("nullValue", "")
.option("quoteMode", "NONE")
//.option("delimiter", ";") // assuming `;` is not present in data
.option("header", "true")
.option("codec", "gzip")
.save("s3://trfsmallfffile/FinancialLineItem/output")