【发布时间】:2018-03-16 20:14:37
【问题描述】:
我有很多带有文本限定符的分隔文件(每一列的开头和结尾都有双引号)。分隔符不一致,即可以有任何分隔符,如逗号(,)、竖线(|)、~、制表符(\t)。
我需要用spark.read.textFile(单列)读取这个文件,然后用双引号删除文本限定符和分隔符(需要用空格替换分隔符)。在这里,我想不考虑列,即我不应该分成列
下面是包含 3 列 ID、Name 和 DESC 的测试数据。 DESC 列有额外的分隔符。
val y = """4 , "XAA" , "sf,sd\nsdfsf""""
val pattern = """"[^"]*(?:""[^"]*)*"""".r
val output = pattern replaceAllIn (y, m => m.group(0).replaceAll("[,\n]", " "))
我得到了上面的代码,它适用于静态值。但是我不能申请DF。
“ID”、“姓名”、“DESC”
"1" , "ABC", "A,B C"
"2" , "XYZ" , "ABC 很麻烦"
"3" , "YYZ" , "FER" sfsf,sfd f"
4 , "XAA" , "sf,sd sdfsf"
我需要输出为
ID、姓名、DESC
1 , ABC , A B C
2、XYZ、ABC很麻烦
3、YYZ、FER" sfsf sfd f
4 , XAA , sf sd sdfsf
提前致谢。
已解决
var SourceFile = spark.read.textFile("/data/test.csv")
val SourceFileDF= SourceFile.withColumn("value", RemoveQualifier(col("value")))
def RemoveQualifier = udf((RawData:String)=>
{
var Data = RawData
val pattern = """"[^"]*(?:""[^"]*)*"""".r
Data = pattern replaceAllIn (Data , m => m.group(0).replaceAll("[,]", " "))
Data
})
谢谢。
【问题讨论】:
-
避免重复使用变量来保存多个值。这是误导。
标签: scala apache-spark