为用逗号分隔的字符串列值添加双引号,并以逗号分隔的格式写入CSV文件

时间:2019-10-02 10:47:46

标签: scala apache-spark azure-databricks

在将数据帧以逗号分隔到某个位置的方式写入文件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

0 个答案:

没有答案