给定一个大文本文件,我想使用Apache Spark提取字符n-gram(并行执行任务)。
输入示例(两行文字):第1行:(Hello World,它)第2行:(今天是美好的一天)
输出n-gram:Hel-ell -llo -lo_-o_W-_Wo-Wor-orl-rld-ld,-d,_-,_i-_it-it_-t_i-_is-...等。因此,我希望返回值是RDD [String],每个字符串都包含n-gram。
请注意,在输出n-gram中,新行被视为空白。我将每行放在括号中以使其清楚。另外,为了清楚起见,字符串或文本不是RDD中的单个条目。我使用sc.textFile()方法读取文件。
主要思想是将每个分区内的所有行合并为一个长字符串。接下来,我们将“”替换为“ _”,并在此字符串上调用slide以并行为每个分区创建三元组。
注意:产生的三字母组可能不是100%准确的,因为我们将从每个分区的开始和结尾错过一些三字组。由于每个分区的长度可以达到几百万个字符,因此保证的损失应该可以忽略不计。这里的主要好处是每个分区可以并行执行。
这是一些玩具数据。以下所有内容均可在任何Spark REPL上执行:
scala> val data = sc.parallelize(Seq("Hello World, it","is a nice day"))
data: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[12]
val trigrams = data.mapPartitions(_.toList.mkString(" ").replace(" ","_").sliding(3))
trigrams: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[14]
在这里,我将收集trigram,以显示它们的外观(如果数据集很大,则可能不希望这样做)
scala> val asCollected = trigrams.collect
asCollected: Array[String] = Array(Hel, ell, llo, lo_, o_W, _Wo, Wor, orl, rld, ld,, d,_, ,_i, _it, is_, s_a, _a_, a_n, _ni, nic, ice, ce_, e_d, _da, day)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句