我不理解在Scala Spark中的 'RDD.map{ case (A, B) => A }' 是什么意思。

5

我对Scala Spark还比较新,有一个关于map方法的问题。

我的理解是:map是RDD方法,它接受一个函数作为参数,例如:map(line => line.split(","))

我发现这种表达方式很难理解。

val uniqueUsers = data.map { case (user, product, price) => user }.distinct().count()

有两个问题需要解释:

  1. 为什么要使用{}而不是()
  2. 我能否将case (user, product, price) => user视为函数?如果不是,那它是什么?

提前感谢您的帮助。

1个回答

14
在Scala中,语法{ case arg => body }是一个偏函数
从Scala-Doc中可以得到偏函数的定义:
引用:

类型为PartialFunction[A, B]的偏函数是一元函数,其定义域不一定包括A类型的所有值。函数isDefinedAt允许动态测试一个值是否在函数的定义域中。

在你的例子{ case (user, product, price) => user }中,您已经定义了一个函数,它以Tuple3对象作为输入。这个Tuple3对象被解包成三个变量userproductprice,并且函数体只返回user
因此,回答你的问题:
  1. 为什么要使用{}而不是()

    因为偏函数必须用花括号括起来。

  2. 我可以把case (user, product, price) => user看作一个函数吗?如果不是,它是什么?

    是的。{ case (user, product, price) => user }是一种特殊类型的函数,称为偏函数,它仅针对特定的输入进行定义,并且对于其他输入未定义。在您的例子中,偏函数仅对Tuple3[T1,T2,T3]类型的输入进行了定义,其中T1、T2和T3是用户、产品和价格对象的类型。


谢谢!{ case (user, product, price) => user } 是一个特殊的函数 PartialFunction。但是 data.map({ case (user, product, price) => user }) 看起来更容易理解,它也是合法的吗? - Phil
data.map({ case (user, product, price) => user }) 是合法的。你只是将部分函数 ({ case (user, product, price) => user } 作为输入传递给了你的 map 函数。在 Scala 中,object.funtion(arg)object function arg 都是有效的,你可以使用任何一种形式。 - rogue-one

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接