有没有更好的方法将Iterator [char]转换为Seq [String]?

时间:2018-03-15 14:51:51

标签: scala apache-spark

以下是我用来将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

有更好的编码方式吗?

2 个答案:

答案 0 :(得分:0)

通过完全忽略有关空字符串等的角落案例,我将从以下内容开始:

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并将其转换为 String pageName = "http://google.com"; Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(pageName)); intent.putExtra(Browser.EXTRA_APPLICATION_ID, getApplication().getPackageName()); startActivity(intent); s。

答案 1 :(得分:0)

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

  

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, ""))

你应该resultRDD[String],而迭代器

1234567890
1234567890
1234567890
1234567890
12
34567890

已更新

如果在第3和第4位之间有\n\r,并且结果是10位数文本的固定长度然后您可以使用wholeTextFiles的{​​{1}} api并使用以下正则表达式作为

sparkContext

您应该输出

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

我希望答案很有帮助