根据spark scala中的字符串将文件拆分为多个文件

时间:2018-02-22 13:27:12

标签: scala apache-spark

我有一个文本文件,下面的数据没有特定的格式

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。

2 个答案:

答案 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
}