我有一个文本文件,下面的数据没有特定的格式
abc*123 *180109*1005*^*001*0000001*0*T*:~
efg*05*1*X*005010X2A1~
k7*IT 1234*P*234df~
hig*0109*10052200*Rq~
abc*234*9698*709870*99999*N:~
tng****MI*917937861~
k7*IT 8876*e*278df~
dtp*D8*20171015~
我希望输出为两个文件,如下所示:
基于字符串abc
,我想拆分文件。
文件1:
abc*123 *180109*1005*^*001*0000001*0*T*:~
efg*05*1*X*005010X2A1~
k7*IT 1234*P*234df~
hig*0109*10052200*Rq~
文件2:
abc*234*9698*709870*99999*N:~
tng****MI*917937861~
k7*IT 8876*e*278df~
dtp*D8*20171015~
文件名应为IT名称(行以k7开头),因此file1名称应为IT_1234,第二个文件名应为IT_8876。
答案 0 :(得分:1)
我用于项目的这个小伎俩:
sc.hadoopConfiguration.set("textinputformat.record.delimiter", "abc")
您可以设置spark上下文的分隔符以读取文件。所以你可以这样做:
val delimit = "abc"
sc.hadoopConfiguration.set("textinputformat.record.delimiter", delimit)
val df = sc.textFile("your_original_file.txt")
.map(x => (delimit ++ x))
.toDF("delimit_column")
.filter(col("delimit_column") !== delimit)
然后,您可以映射要写入文件的DataFrame(或RDD)的每个元素。
这是一种肮脏的方法,但它可能对你有帮助!
度过美好的一天
PS:最后的过滤器是使用连接分隔符删除第一行为空的
答案 1 :(得分:0)
您可以从 sparkContext的 wholeTextFiles
函数中受益,以读取该文件。然后解析它以分隔字符串(这里我使用####
作为不会在文本中重复的字符的不同组合)
val rdd = sc.wholeTextFiles("path to the file")
.flatMap(tuple => tuple._2.replace("\r\nabc", "####abc").split("####")).collect()
然后循环数组以保存要输出的文本
for(str <- rdd){
//saving codes here
}