在将数据帧以逗号分隔到某个位置的方式写入文件csv时,目的是获得用双引号引起来的字符串列值,而用双引号引起来的int列值。
在将数据帧以逗号分隔到某个位置的情况下写入csv文件时,目的是获得用双引号引起来的字符串列值和不使用双引号引起来的int列值。 使用下面的代码,可以得到预期的结果,直到用逗号分隔一列值为止(例如“本地玻璃CA南南W&S”)。 在这种情况下,将Value列写入csv,如:NUL“ CA的南玻璃W&S,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")
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