Al *_*sen 5 scala apache-spark
给定一个大文本文件,我想使用 Apache Spark 提取字符 n-gram(并行执行任务)。
示例输入(2 行文本):第 1 行:(Hello World,它)第 2 行:(美好的一天)
输出n-grams: 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() 方法读取文件。
主要思想是获取每个分区中的所有行并将它们组合成一个长字符串。接下来,我们将“”替换为“_”,并调用该字符串上的滑动来并行地为每个分区创建三元组。
注意:生成的三元组可能不是 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]
Run Code Online (Sandbox Code Playgroud)
在这里,我将收集三元组来展示它们的样子(如果您的数据集很大,您可能不想这样做)
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2111 次 |
| 最近记录: |