June 09, 2017

Spark Submit的ClassPath问题

需求场景: 我们的产品需要与客户的权限系统对接,即在登录时使用客户的认证系统进行认证。集成认证的方式是调用客户提供的jar包,调用userService的authenticate方法。同时,还需要在classpath中提供密钥的key文件。

从需求看,这个集成并不复杂,且客户也提供了较翔实的接口文档与示例案例,开发工作量非常小。唯一的阻碍是客户有安全要求,内部的Jar包及其他文件都不能拷贝出来,而我们的开发环境是不能连接客户内网的。客户提供的Jar包并没有通过Maven来管理,我们只能采用直接导入的方式。在我们的Scala项目中,可以直接将要依赖的jar包放在module的lib文件夹下,......

December 29, 2016

Spark中进行聚合时的特殊场景

在对数据进行统计分析时,如果对指标进行聚合运算,而待查询的字段中还包含了维度,则原则上我们还需要按照维度字段进行分组。倘若这个聚合运算为sum函数,分组之后就相当于分类汇总了。有一种特殊场景是我们对指标执行了sum聚合,查询字段也包含了维度,但我们不希望对维度分组。例如:

select name, role, sum(income) from employee

虽然返回的结果挺奇怪,因为它事实上是针对整张表的income进行了求和运算,与name、role无关。查询结果中返回的其实是第一条记录的name与role。但至少在MySQL中,这样的SQL语法是正确的。

但是在Spark中,执行......

December 26, 2016

Akka中的Scheduler

Actor之间进行通信时,通常都会立即发送消息,然后即刻返回,不会阻塞。但是,AKKA也支持我们对Actor设置Scheduler,用以控制发送消息的次数和时间。

Scheduler由ActorSystem提供,可以对Actor的消息发送进行调度。可以通过ActorContext获得当前的ActorSystem,进而获得Scheduler。如下方法是定期在5秒后执行一次:

import scala.concurrent.ExecutionContext

import scala.concurrent.duration._

import context.dispatcher

context.......

December 30, 2015

Spark中的rollup

在对数据进行小计或合计运算时,rollup和cube一样,算是常用的操作了。Spark的DataFrame提供了rollup函数支持此功能。

假设准备了如下数据:

trait SalesDataFrameFixture extends DataFrameFixture

with SparkSqlSupport {

implicit class StringFuncs(str: String) {

def toTimestamp = new Timestamp(Date.valueOf(str).getTime)

}

import sqlContext.implicits......

December 24, 2015

Spray中对复杂JSON的序列化与反序列化

在Spray中,倘若我们希望REST服务支持JSON格式的request与response,通常使用Spray提供的Json4sSupport,只需要Spray的Route继承它即可。它基本上可以应付常规的Scala类(多数情况是case class)与Json格式之间的序列化与反序列化。

倘若需要支持Scala的枚举类型,或者Joda框架提供的Time类型,可以利用Json4s的扩展,只需要在项目依赖文件sbt中添加该依赖:

val json4sExt = "org.json4s" %% "json4s-ext" % json4sVersion

......