有没有更好的方法将迭代器[字符]转换为Seq[字符串]



以下是我用来将Iterator[char]转换为Seq[String]的代码。

val result = IOUtils.toByteArray(new FileInputStream (new File(fileDir)))
val remove_comp = result.grouped(11).map{arr => arr.update(2, 32);arr}.flatMap{arr => arr.update(3, 32); arr}
val convert_iter = remove_comp.map(_.toChar.toString).toSeq.mkString.split("n")
val rdd_input = Spark.sparkSession.sparkContext.parallelize(convert_iter)

val fileDir:

12**34567890
12@@34567890
12!!34567890
12¬¬34567890
12
'34567890

我对这段代码不满意,因为数据大小很大,转换为字符串最终会得到堆空间。

val convert_iter = remove_comp.map(_.toChar)
convert_iter: Iterator[Char] = non-empty iterator

有没有更好的编码方法?

通过完全忽略关于空字符串等的极端情况,我将从以下内容开始:

val test = Iterable('s','f','n','s','d','n','s','v','y')
val (allButOne, last) = test.foldLeft( (Seq.empty[String], Seq.empty[Char]) ) {
  case ((strings, chars), char) =>
    if (char == 'n')
      (strings :+ chars.mkString, Seq.empty)
    else
      (strings, chars :+ char)
}
val result = allButOne :+ last.mkString

我相信它可以变得更优雅,更好地处理极端情况(一旦你定义你想要处理它们(,但我认为这是一个很好的起点。

但老实说,我不完全确定你想要实现什么。我只是猜测您想将按n划分的字符分组在一起并将它们变成String s。

查看您的代码,我看到您正在尝试从包含以下数据的文件中替换特殊字符,例如 **@@

12**34567890 12@@34567890 12!!34567890 12¬¬34567890 12 '34567890

为此,您可以使用sparkContext textFile读取数据并使用正则表达式replaceAllIn

val pattern = new Regex("[¬~!@#$^%&*\(\)_+={}\[\]|;:"'<,>.?` /\-]")
val result = sc.textFile(fileDir).map(line => pattern.replaceAllIn(line, ""))

你应该让你result RDD[String]这也是一个迭代器

1234567890
1234567890
1234567890
1234567890
12
34567890

更新

如果在第 3 位和第 4 位的文本之间有nr,并且如果结果都是 10 位文本的固定长度,那么您可以使用 sparkContext 的 API wholeTextFiles并使用以下正则表达式作为

val pattern = new Regex("[¬~!@#$^%&*\(\)_+={}\[\]|;:"'<,>.?` /\-rn]")
val result = sc.wholeTextFiles(fileDir).flatMap(line => pattern.replaceAllIn(line._2, "").grouped(10))

您应该将输出为

1234567890
1234567890
1234567890
1234567890
1234567890

我希望答案对您有所帮助

最新更新