Spark SQL
许可证: Apache License, Version 2.0
活跃度: 高
目的: SQL访问Hadoop数据
官方地址: http://spark.apache.org/sql/
Hadoop集成: API兼容
如果你需要SQL来访问数据而且Hive又表现得不是那么好,而且你也愿意用Spark环境,那么你就应该考虑下 Spark SQL。Spark中的SQL原来称为Shark项目,是Hive的入口,但是Shark已经停止了开发,它的继承者Spark SQL现在是Spark上主流的SQL项目。在博文《Shark, Spark SQL, Hive on Spark, and the Future of SQL on Spark》提供了更多的变更信息。Spark SQL类似于Spark,有一个内存计算模型,因为其速度原因它可以帮助报账。它只是在近几年才降低了内存成本,而且已经在大内存的Linux服务器上已经普遍存在了,因此引领了大数据集的内存计算的最新进展。因为内存访问时间一般来说讲都是磁盘访问时间的百分之一,如果尽可能多地放在内存中那是非常吸引人的,用磁盘就不能那么频繁了。但是放弃MapReduce使得Spark SQL更快,即使它需要访问内存。
虽然Spark SQL用的是Hive查询语言HQL,但是它有一些额外的特征是Hive没有的。一个就是在用户会话期间可以缓存表数据。这可以相应其他许多的数据库中临时表,但是与其他数据库不同的是,这些表是在内存中的,因此访问速度也非常快。Spark SQL也允许访问表虽然它们是Spark弹性分布式数据库(RDD)。
Spark SQL支持Hive元存储,大部分的查询语言以及数据格式,所以现有的Hive用户应该比其他用户更容易转换到Shark。但是,尽管Spark文档目前还没有完全对这一块说明,不是所有的Hive特征都在Spark SQL都实现了。目前有Python,Java和Scala的API。想了解更多请看Hive部分。Spark SQL也可以运行Spark的MLlib机器学习算法作为SQL声明。
Spark SQL可以用JSON和Parquet作为数据源,所以在HDFS环境中是非常有用的。
教程链接
在项目主页上有很多教程
示例代码
从用户角度看,Shark有点像Hive,所以如果你可以写Hive,那么你基本可以写Spark SQL。但是你需要搭建Spark SQL环境。这里应该用Python解决这个问题,我们在另一个例子中用电影的评论数据(想理解创建,需要读“Spark”部分的内容,还有一些Python的知识)
# Spark requires a Context object. Let's assume it exists
# already. You need a SQL Context object as well
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
# Load a the CSV text file and convert each line to a Python
# dictionary using lambda notation for anonymous functions.
lines = sc.textFile("reviews.csv")
movies = lines.map(lambda l: l.split(","))
reviews = movies.map(lambda p: {"name": p[0], "title": p[1], "rating": int(p[2])})
# Spark SQL needs to think of the RDD
# (Resilient Distributed Dataset) as a data schema
# and register the table name
schemaReviews = sqlContext.inferSchema(reviews)
schemaReviews.registerAsTable("reviews")
# once you've registered the RDD as a schema,
# you can run SQL statements over it.
dune_reviews = sqlContext.sql("SELECT * FROM reviews WHERE title = 'Dune'")