【问题标题】:Using 'case' in PairRDDFunctions.reduceByKey()在 PairRDDFunctions.reduceByKey() 中使用“案例”
【发布时间】:2015-06-16 18:28:36
【问题描述】:

这是reduceByKey方法的语法

def reduceByKey(func: (V, V) ⇒ V): RDD[(K, V)] 

在我正在练习的字数统计程序中,我看到了这段代码,

val counts = words.map(word => (word, 1)).reduceByKey{case (x, y) => x + y}

该应用程序使用(x, y) 而不是case(x, y)case 这里有什么用。我还检查了@ghik here 的答案。但看不懂

【问题讨论】:

    标签: scala apache-spark pattern-matching


    【解决方案1】:

    Scala 支持多种定义匿名函数的方式。 “案例”版本被称为Pattern Matching Anonymous Functions,或多或少等同于:

    (x: Int, y: Int) => (x, y) match { case (x, y) => x + y }
    

    而没有case 的版本几乎是它的样子:

    (x: Int, y: Int) => x + y
    

    在这种情况下,简单的_ + _ 就足够了:

    val counts = words.map(word => (word, 1)).reduceByKey(_ + _)
    

    当您使用 Scala Options 时,您可以从使用模式匹配中受益的最简单的情况可能是:

    (x: Option[Int], y: Option[Int]) => (x, y) match {
        case (Some(xv), Some(yv)) => xv + yv
        case (Some(xv), _) => xv
        case (_, Some(yv)) => yv
        case _ => 0
    } 
    

    【讨论】:

    • 谢谢。使用 case(x, y) 而不是使用 (x, y) 到底有什么好处。我仍然可以使用 (x, y) 而不是 case(x, y) 获得相同的结果
    • 在这种特殊情况下,我看不到任何好处,但一般来说,模式匹配要灵活得多,尤其是当您想要分解数据结构或使用 case classes 时,模式匹配可用于恢复构造函数参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    相关资源
    最近更新 更多