情况如下
原始数据如这样
cat test.csv
a,b,c,"ff,kk",d,"ee,mm"
csv默认以逗号分割如果以此形式直接load 进入hive表 csv 进入hive表默认分割符号也为逗号
load data inpath 'test.csv' into table test
数据会变成这样 a,b,c,ff,kk,d,ee,mm
那肯定不行因为一个字段被切分成了多个字段
所以解决办法是要忽略双引号中的逗号
1 试过从hive入手改变分隔符,忽略“” 尝试无果
2 从原始数据出发 直接用spark 读取csv并忽略双引号中的逗号,
val data=spark.read.option("escape","\"").csv("test.csv")
//注册临时表
data.createOrReplaceTempView("table1")
sql("select _c0,_c1,regexp_replace(_c33,',',' ')") 将c33 字段中的逗号替换成空格
sql("select _c0,_c1,regexp_replace(_c33,',',' ')") .write.format("csv").write("hdfs://ip:8020/xxx")
sql("select _c0,_c1,regexp_replace(_c33,',',' ')") 将c33 字段中的逗号替换成空格 但是字段中会有 ""包裹
所以在用一次regexp_replace 替换"" 为空
sql("select _c0,_c1, regrxp_replace(regexp_replace(_c33,',',' ') ,'\"','') ")
split(",| ") | 表示按照多个切割符号来切分
map(_.split(",(?=([^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)",-1))
分割忽略双引号中逗号