心猿意码Scala之入门

by:leotse

为什么是Scala

有人问Java之父James Gosling“除了Java语言以外,您现在还使用JVM平台上的哪种编程语言?”,他毫不犹豫的回答“Scala”。

During a meeting in the Community Corner (java.net booth) with James Gosling, a participant asked an interesting question:”Which Programming Language would you use now on top of JVM, except Java?”. The answer was surprisingly fast and very clear: - Scala.

可见,Scala是一门很受待见的编程语言,另一位大牛Horstmann指出,Scala试图将以下三组对立的思想融合在一门编程语言中:

函数式编程 VS 面向对象编程
富有表达力的语法 VS 静态类型
高级的语言特性 VS 与Java高度集成

这样看来,Scala就是想集各家所长,打造一种平衡的和谐,这看起来像是编程语言世界的乌邦托。

Hive之JOIN操作

by:leotse

Introduction

在MySQL等关系型数据库中,我们经常会用到联表查询,用以查询多张表的数据。
使用联表查询的场景一般是:我们需要对两张或多张表中的数据进行关联,从而得到我们所需要的数据集。

在Hive中,也存在这样的场景,特别是进行数据分析的时候,但是,Hive虽然支持Hive JOIN语句,但是只限于等值连接,也就是说,只支持a.col=b.col而不支持a.col >= b.col这类的条件,主要原因是通过MapReduce很难实现这种类型的联接。

接下来,我们将分析和介绍Hive中主要的JOIN操作。

Python多进程使用

by:leotse

Intro

我们知道,由于GIL的关系,Python中多线程并不被看好。因此,Python我们常常使用模块subprocess模块和多进程multiprocessing模块来实现并发。而subprocess因为是调用外部程序而且只是通过管道进行文本交流,因此我们建议在Python并发编程中,尽量使用multiprocessing。

multiprocessing模块和threading模块很像,该模块同时提供了本地和远程并发,你也不用担心GIL产生的副作用。并且multiprocessing可以在Unix和Windows下使用(区别于为shell而生的subprocess)。

Python任务调度队列Celery

by:leotse

Introduction

在Python的使用过程中,我们常常会遇到执行一些多进程任务,或者一系列长时间的后台任务。比如,多进程下载视频并上传到某一个文件系统中。这时候,我们可以使用任务调度队列帮我们进行任务的分发与管理。

Celery就是这样一个任务队列,易于使用,入门简单。Celery常常需要第三方作为发送和接收消息的中间层,一般我们用到的有RabbitMQ、Redis、MongoDB等等,次等的选择也可以是数据库。

一般推荐使用RabbitMQ,但是我们这里用到Redis,因为Redis安装的时候依赖少,而且性能稳定,但是Redis也有缺点,那就是断电的时候会丢失数据。我们在这里,就以Redis作为Celery的第三方中间层。

Hive浮点数比较与计算

by:leotse

Hive浮点数比较

Hive的较早前版本(0.9.0)在比较浮点数时会出现问题,如下:
hive> select * from float_compare where weight>120.9;
OK
xiefeng 128.2
yolovon 121.8
leotse 120.9
我们可以看到,leotse乱入了,他的weight等于120.9,这一点与我们的预期不符合。设想一下,如果这些数据不是weight而是money,那么结果就会变成后果。这是Hive的一个BUG,我们在Hive的issues上可以看到Float comparison doesn’t work。这个问题已经解决了,但是我们仍然可以分析一下其他的原因。