Partial Function

本文探讨了Scala编程语言中PartialFunction特性的使用,重点介绍了如何通过case表达式处理不同类型的输入数据,以及在Spark程序中利用PartialFunction提高代码可读性和效率的方法。此外,文章还对比了使用case表达式与传统方式处理tuple映射操作的优劣,并解释了partially applied function的概念。

Partial Function指的是对输入数据中的某一类型数据起作用的函数。它的声明如下:

traitPartialFunction[-A+B] extends (A) ⇒ B

是函数的子trait

使用如下,例如:

val toZero : PartialFunction[Int,Int] = {
     | case one if (one < 0)  => 0
     | }
     
scala> toZero.isDefinedAt(1)
res14: Boolean = false

scala> toZero(-1)
res15: Int = 0


神奇的case:

  val actionRank = formatedRDD //生成了(imac,ip,version,data,data) 的tuple,可能有()或者其他
                    .map {
                      case (imac, ip, version, date, data) => ((imac, version),Try(data.split("#").last.split(":")(1).toLong).getOrElse(0l))
                    }

这个例子可以看出,在实际使用中,传给一个函数的可能有多种类型的数据,使用case可以处理你想要处理的那种类型数据,而这正是Partial Function的优势。

使用Scala编写spark程序中,使用case可以让tuple,map等程序中变量更易读。

val dollar = Map("China" -> "CNY", "US" -> "DOL")
//perfer
dollar.foreach {
     case (country, currency) => println(s"$country -> $currency")
     }
 //avoid
 dollar.foreach ( x => println(s"$x._1 -> $x._2") )

大量使用_.1,_.2等形式,过几天自己写的数据结构也难以读懂。


另外,partially applied function 指的是:函数参数已经有了默认值。

例如:

def add(i: Int, j: Int) = i + j
val add5 = add(_: Int,5)


转载于:https://my.oschina.net/yulinguo/blog/405445

snailjob连接服务端报错2025-05-28 10:12:59 [snail-job-grpc-client-executor-127.0.0.1-1] ERROR c.a.s.c.c.handler.ClientRegister - heartbeat check requestId:[0] message:[INTERNAL: http2 exception]客户端报错2025-05-28 10:25:16 [NETTY_ACTOR_SYSTEM-akka.actor.netty-receive-request-dispatcher-14] ERROR c.a.s.s.c.r.s.RequestHandlerActor - http request error. [] com.aizuda.snailjob.server.common.exception.SnailJobServerException: Token authentication failed. [namespace:null groupName:null token:null] at com.aizuda.snailjob.server.common.rpc.server.RequestHandlerActor.doProcess(RequestHandlerActor.java:84) at com.aizuda.snailjob.server.common.rpc.server.RequestHandlerActor.lambda$createReceive$0(RequestHandlerActor.java:63) at akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:24) at akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:20) at scala.PartialFunction.applyOrElse(PartialFunction.scala:214) at scala.PartialFunction.applyOrElse$(PartialFunction.scala:213) at akka.japi.pf.UnitCaseStatement.applyOrElse(CaseStatements.scala:20) at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:269) at akka.actor.Actor.aroundReceive(Actor.scala:537) at akka.actor.Actor.aroundReceive$(Actor.scala:535) at akka.actor.AbstractActor.aroundReceive(AbstractActor.scala:220) at akka.actor.ActorCell.receiveMessage(ActorCell.scala:579) at akka.actor.ActorCell.invoke(ActorCell.scala:547) at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:270) at akka.dispatch.Mailbox.run(Mailbox.scala:231) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) 2025-05-28 10:25:16 [NETTY_ACTOR_SYSTEM-akka.actor.default-dispatcher-10] ERROR akka.actor.OneForOneStrategy - Json转对象失败 参数: com.aizuda.snailjob.common.core.exception.SnailJobCommonException: Json转对象失败 参数: at com.aizuda.snailjob.common.core.util.JsonUtil$JsonMapper.toJavaObject(JsonUtil.java:285) at com.aizuda.snailjob.common.core.util.JsonUtil.parseObject(JsonUtil.java:53) at com.aizuda.snailjob.server.common.rpc.server.RequestHandlerActor.lambda$createReceive$0(RequestHandlerActor.java:66) at akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:24) at akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:20) at scala.PartialFunction.applyOrElse(PartialFunction.scala:214) at scala.PartialFunction.applyOrElse$(PartialFunction.scala:213) at akka.japi.pf.UnitCaseStatement.applyOrElse(CaseStatements.scala:20) at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:269) at akka.actor.Actor.aroundReceive(Actor.scala:537) at akka.actor.Actor.aroundReceive$(Actor.scala:535) at akka.actor.AbstractActor.aroundReceive(AbstractActor.scala:220) at akka.actor.ActorCell.receiveMessage(ActorCell.scala:579) at akka.actor.ActorCell.invoke(ActorCell.scala:547) at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:270) at akka.dispatch.Mailbox.run(Mailbox.scala:231) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: No content to map due to end-of-input at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1] at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:5008) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4910) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3860) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3828) at com.aizuda.snailjob.common.core.util.JsonUtil$JsonMapper.toJavaObject(JsonUtil.java:283) ... 18 common frames omitted 2025-05-28 10:25:16 [NETTY_ACTOR_SYSTEM-akka.actor.default-dispatcher-10] INFO akka.actor.RepointableActorRef - Message [akka.dispatch.sysmsg.Recreate] from Actor[akka://NETTY_ACTOR_SYSTEM/user/$e#607696578] to Actor[akka://NETTY_ACTOR_SYSTEM/user/$e#607696578] was not delivered. [5] dead letters encountered. If this is not an expected behavior then Actor[akka://NETTY_ACTOR_SYSTEM/user/$e#607696578] may have terminated unexpectedly. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 2025-05-28 10:25:16 [NETTY_ACTOR_SYSTEM-akka.actor.default-dispatcher-10] ERROR akka.actor.OneForOneStrategy - Json转对象失败 参数: com.aizuda.snailjob.common.core.exception.SnailJobCommonException: Json转对象失败 参数: at com.aizuda.snailjob.common.core.util.JsonUtil$JsonMapper.toJavaObject(JsonUtil.java:285) at com.aizuda.snailjob.common.core.util.JsonUtil.parseObject(JsonUtil.java:53) at com.aizuda.snailjob.server.common.rpc.server.RequestHandlerActor.lambda$createReceive$0(RequestHandlerActor.java:66) at akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:24) at akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:20) at scala.PartialFunction.applyOrElse(PartialFunction.scala:214) at scala.PartialFunction.applyOrElse$(PartialFunction.scala:213) at akka.japi.pf.UnitCaseStatement.applyOrElse(CaseStatements.scala:20) at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:269) at akka.actor.Actor.aroundReceive(Actor.scala:537) at akka.actor.Actor.aroundReceive$(Actor.scala:535) at akka.actor.AbstractActor.aroundReceive(AbstractActor.scala:220) at akka.actor.ActorCell.receiveMessage(ActorCell.scala:579) at akka.actor.ActorCell.invoke(ActorCell.scala:547) at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:270) at akka.dispatch.Mailbox.run(Mailbox.scala:231) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: No content to map due to end-of-input at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1] at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:5008) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4910) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3860) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3828) at com.aizuda.snailjob.common.core.util.JsonUtil$JsonMapper.toJavaObject(JsonUtil.java:283) ... 18 common frames omitted
最新发布
05-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值