我无法理解Scala Spark中的'RDD.map {case(A,B)=> A}'

Phi*_*hil 3 scala apache-spark

我对Scala Spark比较陌生.我有一个map方法的问题.

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

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

val uniqueUsers = data.map { case (user, product, price) => user }.distinct().count()
Run Code Online (Sandbox Code Playgroud)

有人可以为我解释两件事:

  1. 为什么{}不使用()
  2. 我可以case (user, product, price) => user视为一种功能吗?如果没有,那是什么?

先感谢您.

rog*_*one 8

在Scala中,语法{ case arg => body }部分函数.

从Scala-Doc定义部分功能

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

在您{ case (user, product, price) => user }已定义部分函数的情况下,将Tuple3对象作为输入.这个Tuple3对象被解压缩为3个变量user,product并且price函数体只返回user.

所以回答你的问题

  1. 为什么{}不使用()

    因为部分函数必须用花括号包裹.

  2. 我认为案例(用户,产品,价格)=>用户作为一种功能?如果没有,那是什么?

    是.{ case (user, product, price) => user }是一种称为PartialFunction的特殊类型的函数,它仅为特定输入定义,不为其他输入定义.在您的情况下,PartialFunction仅定义为输入Tuple3[T1,T2,T3]T1,T2和T3是用户,产品和价格对象的类型