Добавьте двойные кавычки для строкового столбца, разделенного запятой, и запишите в CSV-файл с запятой - PullRequest
0 голосов
/ 02 октября 2019

При записи фрейма данных в файл 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
...