以下是我用来将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
有更好的编码方式吗?
答案 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, ""))
你应该result
为RDD[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))
我希望答案很有帮助