Добавление пользовательского разделителя добавляет двойные кавычки в итоговом кадре данных искры 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|!|
1 ответ
Это стандартная функция CSV. Если в фактических данных встречается разделитель (называемый Столкновение разделителя), поле заключается в кавычки.
Ты можешь попробовать
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")