При записи фрейма данных в файл csv с запятой, разделенной в некотором месте, целью является получение значения строкового столбца, заключенного в двойные кавычки, и значения столбца int без двойных кавычек.
При записи фрейма данных в файл csv сзапятая, ограниченная некоторым местоположением, цель состоит в том, чтобы получить значение столбца строки, заключенное в двойные кавычки, и значение столбца int без двойных кавычек. Используя приведенный ниже код, можно получить ожидаемые результаты, пока одно значение столбца не будет разделено запятой (например, «ЮЖНЫЕ ГЛАЗЫ W & S OF CA, LOCAL»). В этом случае столбец Value записывается в csv как: NUL "ЮЖНЫЕ ГЛАЗЕРЫ W & S OF CA, NOCAL" NUL. При попытке с разделителем трубы ("|") получить правильный результат, но требуется вывод с разделителями-запятыми.
Структура таблицы:
%sql
CREATE TABLE A.dummy_table
(
col1 string,
col2 string,
col3 int
)
Данные таблицы:
%sql
insert into A.dummy_table values('A','B',1),('C','D',2),('SOUTHERN GLAZERS W&S OF CA, NOCAL','DOWE AVE',1234)
%sql
select* from A.dummy_table
col 1 col 2 col 3
SOUTHERN GLAZES W&S OF CA, LOCAL DOE AVE 1234
A B 1
C D 2
Преобразование данных таблицы во фрейм данных:
var df = spark.sql("select * from A.dummy_table")
Код для добавления кавычек в столбце String и удаления кавычек для столбца Int Значение:
var df_new = df.select(df.columns.map(x =>concat(lit("\""),col(x),lit("\"")) as x):_*)
val int_columns = df.dtypes.filter(_._2 !="StringType").map(_._1)
for(colName<-int_columns)
{
df_new = df_new.withColumn(colName,regexp_replace(col(colName),"\"",""))
}
df_new.coalesce(1).write.format("com.databricks.spark.csv").mode("overwrite").option("ignoreLeadingWhiteSpace",false).option("ignoreTrailingWhiteSpace",false).option("header", "true").option("quote","\u0000").option("delimiter",",").save("somePath")
val fileNm = dbutils.fs.ls("somePath").map(_.name).filter(r => r.startsWith("part-00000"))(0)
dbutils.fs.mv("somePath"+"/"+fileNm,"someFinalPath")
dbutils.fs.rm("somePath",true)
Ожидаемый результат:
col1,col2,col3
"SOUTHERN GLAZERS W&S OF CA, NOCAL","DOWE AVE",1234
"A","B",1
"C","D",2
Фактический результат
col1,col2,col3
NUL"SOUTHERN GLAZERS W&S OF CA, NOCAL"NUL,"DOWE AVE",1234
"A","B",1
"C","D",2