以下是我用来将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 位的文本之间有n
和r
,并且如果结果都是 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
我希望答案对您有所帮助