Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何在Spark中使用组合?_Scala_Apache Spark - Fatal编程技术网

Scala 如何在Spark中使用组合?

Scala 如何在Spark中使用组合?,scala,apache-spark,Scala,Apache Spark,我想知道方法组合 事实上,我有 输入: sQmqgE sQmqgE sQmqgE sQmqgE JKOPDB JKOPDB JKOPDB YGJs YGJs YGJs ERLnA ERLnA ERLnA ERLnA ERLnA XPfQ hntJdN hntJdN hntJdN hntJdN hntJdN BPAdv BPAdv BPAdv BPAdv lTOF lTOF SPrVV SPrVV aavqj 我的代码: test.flatMap{line => line.split("

我想知道方法组合

事实上,我有

输入:

sQmqgE sQmqgE sQmqgE sQmqgE JKOPDB JKOPDB JKOPDB YGJs YGJs YGJs ERLnA ERLnA ERLnA ERLnA ERLnA XPfQ hntJdN hntJdN hntJdN hntJdN hntJdN BPAdv BPAdv BPAdv BPAdv lTOF lTOF SPrVV SPrVV aavqj 
我的代码:

test.flatMap{line => line.split(" ")}
            .flatMap{word => word.combinations(2)}
            .map{paire=>(paire.mkString(","),1)}
            .reduceByKey(_ + _) 
输出:

(c,k,1981)
(e,e,1998)
(U,A,1970)
(h,f,1947)
(Y,Q,2133)
(o,s,2077)
(F,F,1965)
但是我想要每个单词的组合,而不是每个字母的组合

--------------编辑---------

这里我们可以看到我的减速机总是返回1。 例如,配对(abc、mno)不应返回1

val myRDD=sc.parallelize(顺序(“abc def ghi mno mno”、“jkl mno pqr abc”))
myRDD:org.apache.spark.rdd.rdd[String]=ParallelCollectionRDD[7]位于parallelize at:27
scala>myRDD.foreach{println}
abc def ghi mno mno
jkl mno pqr abc
scala>myRDD.map(u.split(“”)。flatMap(u.compositions(2))。
|映射(p=>(p.mkString(“,”,1))。
|还原基(u+u0)。
|foreach{println}
(jkl,abc,1)
(def、ghi、1)
(jkl,mno,1)
(abc,ghi,1)
(ghi,mno,1)
(mno,pqr,1)
(国防部,mno,1)
(abc,def,1)
(pqr,abc,1)
(abc,abc,1)
(abc,mno,1)
(mno,abc,1)
(jkl,pqr,1)

(mno,mno,1)
假设您只需要每行中的组合,您可以执行以下操作:

scala> val myRDD = sc.parallelize(Seq("abc def ghi", "jkl mno pqr"))
myRDD: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[1] at parallelize at <console>:24

scala> myRDD.foreach{println}
abc def ghi
jkl mno pqr

scala> myRDD.map(_.split(" ")).flatMap(_.combinations(2)).
     | map(p=>(p.mkString(","),1)).
     | reduceByKey(_+_).
     | foreach{println}
(abc,ghi,1)
(mno,pqr,1)
(abc,def,1)
(jkl,pqr,1)
(def,ghi,1)
(jkl,mno,1)
而在我的版本中,我使用了一个
映射
,它不会展平分割的字符串,并给出一个
RDD[Array[String]]

scala> myRDD.map(_.split(" "))
res1: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[18] at map at <console>:27

scala> res1.foreach(l => println(l.mkString("::")))
abc::def::ghi
jkl::mno::pqr

您的所有数据都在一行上吗?你想要每行内的组合还是跨行的组合?不,我每行大约有20个单词。我想在每一行内的组合,我的减速机将绘制所有文件的组合。完美,请参阅下面的我的答案。回答后请不要更改问题。如果您有一个新问题,请为此特定问题打开一个新的postAs,我在下面对我的答案的评论中对此进行了说明:在应用
mkString
之前对组合进行排序!非常感谢。我还有最后一个问题,我的reducer总是返回1,而不是所有值的总和。它们可能都是唯一的组合。此外,您正在以字符串形式键入组合,这意味着
(a,b)
将不匹配
(b,a)
(即使它应该匹配)。如果您对条目进行排序,那么您将获得一致的结果。如果这有帮助,请非常感谢您的帮助!
scala> myRDD.map(_.split(" "))
res1: org.apache.spark.rdd.RDD[Array[String]] = MapPartitionsRDD[18] at map at <console>:27

scala> res1.foreach(l => println(l.mkString("::")))
abc::def::ghi
jkl::mno::pqr
scala> List("abc", "def", "ghi").combinations(2).map(_.mkString("-")).toList
res2: List[String] = List(abc-def, abc-ghi, def-ghi)

scala> "abc".combinations(2).map(_.mkString("-")).toList
res3: List[String] = List(a-b, a-c, b-c)