【问题标题】:Using reduceByKey with case in scala在scala中使用reduceByKey和case
【发布时间】:2017-10-13 10:11:33
【问题描述】:

我有这种类型;

 column1 column2 int 
 ((a,b),1)
 ((a,c),1)
 ((k,a),1)

我需要两种类型的结果,首先是所有 column2 的 column1

(a,total)

其次column1参数不等于column2参数

(a,total)

对于这种类型,我如何使用 ReduceByKey ?

我的代码:

var data = sc.textFile("tttt.tsv")
var satir = data.map(line=> ((line.split("\t")(1).toString,line.split("\t")(2).toString),1))

---关于第二个场景

我的数据类型示例是

column1 column2 int
a b,1 
a c,1
a a,1
a d,1

我需要 reduceByKey,因为在第二种情况下 column1 不等于 column1

例如,我的示例数据结果 = (a,b,1) + (a,c,1)+(a,d,1) = 3

【问题讨论】:

  • 你能解释一下第二种情况吗
  • 我添加了一些关于第二个场景的内容

标签: scala mapreduce case reduce bigdata


【解决方案1】:

如果我正确理解您的问题,以下是获得您所问问题的一种方法:

val rdd = sc.parallelize(Seq(
  (("a", "b"), 1),
  (("a", "c"), 1),
  (("a", "d"), 1),
  (("a", "a"), 1),
  (("k", "k"), 1),
  (("k", "a"), 1),
  (("k", "b"), 1)
))

val rdd1 = rdd.map{ case ((x, y), c) => (x, c) }.
  reduceByKey(_ + _)

scala> rdd1.collect.foreach(println)
(a,4)
(k,3)

val rdd2 = rdd.filter{ case ((x, y), c) => x != y }.
  map{ case ((x, y), c) => (x, c) }.
  reduceByKey(_ + _)

scala> rdd2.collect.foreach(println)
(a,3)
(k,2)

【讨论】:

  • 嗨 Leo C,非常感谢你的回答,我有两个正确的 rdd。你知道我怎样才能加入这两个 RDD 吗? (例如(a,4)和其次(a,3),我如何加入(a,4,3)?)
  • 很高兴它有帮助。您可以通过toDF("col1", "col2") 然后df1.join(df2, "col1") 将RDD 转换为DataFrame。或者你可以加入像this这样的RDD。
【解决方案2】:

对于第一个场景,您可以使用这个。

val arrangedDF = satir.map(pairData => (pairData._1._1, (pairData._1._2, 1)))
val result1DF = arrangedDF.reduceByKey((x,y) => x._2 + y._2)

在这里我重新排列了数据的表示,我分离了键并将其余数据放入不同的元组中,您可以直接应用reduceByKey

对于第二个场景,您可以使用它。

val result2DF = arrangedDF.filter( pairData => pairData._1 != pairData._2._1).reduceByKey((x,y) => x._2 + y._2)

在第二个场景中,我重用了arrangedDF,并针对您想要的条件应用过滤器,即 column1 参数不等于 column2 参数,然后应用 reduceByKey

希望我的回答很清楚

谢谢

【讨论】:

  • 您好,非常感谢您的回答;当我尝试你的答案时,scala:scala> val result1DF = mappedDF.reduceByKey((x,y) => x._2 + y._2) :30: error: type mismatch;找到:需要 Int:(String, Int) val result1DF = mappedDF.reduceByKey((x,y) => x._2 + y._2)
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 2015-03-26
  • 2023-03-23
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 2017-02-05
相关资源
最近更新 更多