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

根据spark scala中的字符串将文件拆分为多个文件,scala,apache-spark,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~ 我希望输出为两个文件,如下所示: 根据stringab

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

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~
我希望输出为两个文件,如下所示:

根据string
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 name(行以k7开头),因此file1 name应该是IT_1234第二个文件名应该是IT_8876。

我在一个项目中使用了一个小技巧:

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)
然后,您可以将要写入文件的数据帧(或RDD)的每个元素映射到一个文件中

这是一个肮脏的方法,但它可能会帮助你

祝你今天愉快

PS:最后的过滤器是删除第一行,该行是空的,带有连接的分隔符

您可以使用sparkContext的
wholeTextFiles
函数来读取文件。然后解析它以分离字符串(这里我使用了
######
作为不同的字符组合,不会在文本中重复)

然后循环数组以保存要输出的文本

for(str <- rdd){
  //saving codes here
}

用于(str每个新文件中会有多少数据?为什么要使用Spark?为什么不,比如说,bash?文件在HDFS上?是的,你能告诉我们这样做的最终目标吗?这将帮助我们找到合适的解决方案。是的,每小时我们会得到2.5 GB的数据,文件在HDFS中。谢谢。我可以使用这个解决方案关于。我已经编辑了这个问题,请帮助我。您好,我认为您不能在Spark中命名文件。您应该在编写之前使用hadoop库并使用文件名创建路径。或者创建一个shell脚本,如果我有“abc”怎么办在记录中间,在这种情况下,而不是2,我将在输出中得到3条记录。在定义分隔符时,我们可以在这里使用子字符串函数吗?
for(str <- rdd){
  //saving codes here
}