Facebook Twitter LinkedIn E-mail
magnify
Home Archive for category "未分类"

Slick 编程(6): 查询(一)

本篇介绍Slick的基本查询,比如选择,插入,更新,删除记录等。
排序和过滤
Slick提供了多种方法可以用来排序和过滤,比如:

val q = Album.filter(_.albumid === 101)

//select `AlbumId`, `Title`, `ArtistId` 
//from `Album` where `AlbumId` = 101


val q = Album.drop(10).take(5)
//select .`AlbumId` as `AlbumId`, .`Title` as `Title`,
// .`ArtistId` as `ArtistId` from `Album`  limit 10,5


val q = Album.sortBy(_.title.desc)
//select `AlbumId`, `Title`, `ArtistId` 
//from `Album` order by `Title` desc

Join和Zipping
Join指多表查询,可以有两种不同的方法来实现多表查询,一种是通过明确调用支持多表连接的方法(比如innerJoin方法)返回一个多元组,另外一种为隐含连接(implicit join),它不直接使用这些连接方法(比如LeftJoin方法)。
一个隐含的cross-Join 为Query的flatMap操作(在for表达式中使用多个生成式),例如:

val q = for{a <- Album
			b <- Artist
		} yield( a.title, b.name)

//select x2.`Title`, x3.`Name` from `Album` x2, `Artist` x3

如果添加一个条件过滤表达式,它就变成隐含的inner join,例如:

val q = for{a <- Album
			b <- Artist
		    if a.artistid === b.artistid
		} yield( a.title, b.name)

//select x2.`Title`, x3.`Name` from `Album` x2, `Artist` x3 
//where x2.`ArtistId` = x3.`ArtistId`

明确的多表连接则使用innerJoin , leftJoin ,rightJoin,outerJoin 方法,例如:

val explicitCrossJoin = = for {
			 (a,b) <- Album innerJoin Artist  
			 } yield( a.title, b.name)


//select x2.x3, x4.x5 from (select x6.`Title` as x3 from `Album` x6) 
//x2 inner join (select x7.`Name` as x5 from `Artist` x7) x4 on 1=1


 val explicitInnerJoin  = for {
		 (a,b) <- Album innerJoin Artist on (_.artistid === _.artistid)
		 } yield( a.title, b.name)
//select x2.x3, x4.x5 from (select x6.`Title` as x3, x6.`ArtistId` as x7 from `Album` x6) x2 
//inner join (select x8.`ArtistId` as x9, x8.`Name` as x5 from `Artist` x8) x4 on x2.x7 = x4.x9


val explicitLeftOuterJoin   = for {
		 (a,b) <- Album leftJoin Artist on (_.artistid === _.artistid)
		 } yield( a.title, b.name.?)
//select x2.x3, x4.x5 from (select x6.`Title` as x3, x6.`ArtistId` as x7 from `Album` x6) x2 
//left outer join (select x8.`ArtistId` as x9, x8.`Name` as x5 from `Artist` x8) x4 on x2.x7 = x4.x9


val explicitRightOuterJoin   = for {
		 (a,b) <- Album rightJoin Artist on (_.artistid === _.artistid)
		 } yield( a.title.?, b.name)
//select x2.x3, x4.x5 from (select x6.`Title` as x3, x6.`ArtistId` as x7 from `Album` x6) x2 
//right outer join (select x8.`ArtistId` as x9, x8.`Name` as x5 from `Artist` x8) x4 on x2.x7 = x4.x9

注意leftJoin 和 rightJoin中的 b.name.?和 a.title.? 的”.?” 这是因为外部查询时会产生额外的NULL值,你必须保证返回Option类型的值。
除了通常的InnerJoin ,LeftJoin,RightJoin之外,Scala还提供了Zip 方法,它的语法类似于Scala的集合类型,比如:

val zipJoinQuery  = for {
	   (a,b) <- Album zip Artist
	 } yield( a.title.?, b.name)

此外,还有一个zipWithIndex,可以把一个表的行和一个从0开始的整数序列Zip操作,相当于给行添加序号,比如

val zipWithIndexJoin  = for {
	   (a,idx) <- Album.zipWithIndex 
	 } yield( a.title, idx)
 

Scala 专题教程-参数化类型(1): 概述和例子说明

本专题介绍Scala的参数化类型,在介绍的过程中同时演示了信息隐藏的技术,这里我们通过实现一个纯函数化实现的队列来举例说明。
参数化类型帮助你实现通用的类型和Trait。比如通用的集合类Set,该通用集合类可以通过制定类型参数T,Set[T],它通过实例化参数类型,可以定义Set[String],Set[Int]等等。
此外,一般来说 String是AnyRef,但在其它一些语言中,Set[String]并一定是Set[AnyRef]的子类。在Scala中可以通过制定参数化类型之间的继承属性的Variance特性,来说明该参数化类型中使用不同的参数类型后的类型之间是否也存在继承关系。
首先我们定义一些我们要实现的这个简单的对象的一些基本需求:
这个函数化队列要求支持下面三个基本操作:
head 返回队列的首元素
tail 返回队列的除首元素之外的其余元素(也是一个队列)
enqueue 把新元素添加到队列尾部后返回一个新队列。

和一般队列实现不同的是,函数化队列实现时不改变队列的内容,当需要修改队列时构造一个新队列。
如何构造一个效率高的队列呢?也就是head,tail ,enqueue所花费的时间不应当随队列的大小而改变,一个简单的实现可以使用List类来实现,但enqueue操作的时间和队列的长度成正比,这里给出一个使用两个List对象的队列实现,具体算法不解释了(本专题侧重点不在算法本身)可以实现一个高效的队列操作。

class Queue[T](
  private val leading:List[T],
  private val trailing:List[T]
 ){
  private def mirror =
    if(leading.isEmpty)
      new Queue(trailing.reverse,Nil)
    else
       this

  def head=mirror.leading.head
  def tail={
    val q= mirror
      new Queue(q.leading.tail,q.trailing)
  }

  def enqueue(x:T)=
    new Queue(leading,x::trailing)
}

使用这个实现,进行一些基本的队列操作:

scala> val q = new Queue(List(1,2,3),Nil)
q: Queue[Int] = Queue@24cc40b6

scala> val q1 = q enqueue 4
q1: Queue[Int] = Queue@67825189

scala> q
res0: Queue[Int] = Queue@24cc40b6

scala> val p = q1 head
p: Int = 1

scala> q1
res1: Queue[Int] = Queue@67825189

这个实现满足功能需求,但我们希望可以实现如下的形式:

scala> val q = Queue(1,2,3)
q: Queue[Int] = Queue(1,2,3)

scala> val q1 = q enqueue 4
q1: Queue[Int] = Queue(1,2,3,4)

scala> q
q: Queue[Int] = Queue(1,2,3)

在之后的文章我们逐步的优化这个实现。

 

祝大家圣诞快乐并新年好

快过节了,事情也多了些,博客暂时没有更新,这里祝祝大家圣诞快乐并新年好,来年再见。
merry-christmas-hd-wallpapers

 

休假归来

一个多月没有更新博客了,休了五个星期的假,行程绕地球一圈半还多,八年之后重游美国,回顾了一下迪斯尼,不同的是这次是全家一起重游Disney World。
20130801001

将尽快更新博客,敬请关注

 

引路蜂技术博客论坛开放

为了更好的实现技术交流,引路蜂技术博客开始支持技术论坛

网址 http://www.guidebee.info/forum

20130519001

 

欢迎大家注册并发言。

 

(转)科学家实现最快网络传输世界纪录 每秒186GB

据物理学家组织网站报道,科学家们近日实现了创纪录的数据传输速度,从而帮助开启下一代高速数据传输技术之门。11月中 旬在美国西雅图召开的“超级计算2011”(SuperComputing 2011-SC11)会议上,一个国际专家小组实现了广域网络中双向每秒186GB的传输速度。这一速度相当于每天传输200万GB的信息,几乎相当于 10万张完整蓝光光盘的容量。

这个科学家小组由高能物理学家,计算机专家和网络工程师组成。其成员来自美国加州理工大学,维多利亚大学,密歇根大学,欧洲核子研究中心(CERN),佛罗里达国际大学以及其他机构。

研 究人员们表示他们的这项技术将帮助人们应对日益增长的数据传输需求,当今世界每时每刻都有海量的信息通过全球互联网进行跨洋跨洲的快速传播。这些技术将为 下一代告诉数据传输技术奠定基础,这一技术将让传输速度达到每秒40~100G,这样的场景将不再是梦想,而会在未来数年中实现。

哈维·纽 曼(Harvey Newman)教授是高能物理小组(HEP)负责人,他说:“我们的小组展示了在未来我们将如何应对并传输海量数据。有了这样的工具在手,我们将能够实现 他人所无法想象的任务。我们将目睹通向未来的清晰路线图,而其他人甚至连想象都会觉得缺乏信息。”

利用一个由加拿大先进研究创新网络 (CANARIE)和BCNET,一个非营利性IT服务机构提供的100GB网络,这个小组得以实现了在位于加拿大不列颠哥伦比亚省的维多利亚大学计算中 心以及美国华盛顿州西雅图的华盛顿州会议中心之间每秒98GB的传输速度。而与此同时在相反方向上也实现了88GB每秒的传输速度,由此小组实现了双向 186GB每秒的传输,从而打破了同样由该小组保持的每秒119GB的传输速度前世界纪录,他们在2009年创造了该项纪录。

除此之外,小组还和来自佛罗里达大学,加州大学圣迭戈分校,范德堡大学以及巴西和韩国的研究人员通力合作,进行更大规模的演示,在美国加州和美国境内其他地点,巴西和韩国境内设施进行海量数据传输实验。

这 样的高速数据传输对于应对大型科学设备,如大型强子对撞机(LHC)设备产生的海量数据也有着重要作用。这是欧洲核子中心运行的粒子对撞设备,物理学家们 希望它能帮助解答一些有关物质,空间和时间的一些最本质问题。到目前为止,LHC设备产生的数据中已经有超过100PB(相当于400万张蓝光DVD)的 数据进行了处理,科学家们调用一个分布在全球各地的实验室和大学中超过300个计算和存储中心的运算能力应对这一工作。而在未来随着对撞机设备的进一步工 作,其产生的,需要处理的数据预计将以上千倍地增长。

大卫·福斯特(David Foster)是欧洲核子中心IT部门副主管,他说:“让全世界各地的科学家们都能在LHC获得的数据的基础上开展工作,这是我们的目标,因为这样就能将我们这颗星球上最聪明的头脑联系起来,共同为解决宇宙中最大的难题而工作。”

伦达尔·索比(Randall Sobie)是加拿大粒子物理学研究所科学家,同时也是这一小组的成员,他补充说:“SC11会议上展示的100G高速传输正在推进互联网技术的极限边界,它向我们展示了在数小时或数天时间内传输以PB计的海量高能粒子对撞数据是可能的。”

科 学家们表示,这项粒子对撞工作的关键,就是从海量的由于已知的粒子间相互作用引发的背景“噪音”数据中找出可能存在的新发现的线索。为了达成这一目的,全 世界各地的物理学家们必须反复访问,有时候需要下载或传输巨量的数据。这就像是一次从一间存储有数十万张蓝光DVD光碟的储备间中提取数百张碟。HEP小 组希望此次SC11会议上的演示将为未来更加高效的分配方式以及更好的利用LHC的数据铺平道路。

纽曼说:“我们和各个领域的科学家们共享 我们的方案和工具,以此帮助他们更好地进行更领域的研究工作,最大限度地利用100G高速传输技术带来的好处。尤其是,我们希望这项技术将给物理学家们, 尤其是年轻学子们一个机会来直接参与到由LHC发起的,即将到来的下一轮大发现时代中来。”