(9)Spark SQL

9.1 连接Spark SQL

Apache Hive是Hadoop上SQL的引擎,Spark SQL编译时可以包含Hive支持,也可以不包含。如果你不能引入Hive依赖,那就应该使用工件spark-sql-2.10来替代spark-hive-2.10。

 

9.2 在应用中使用Spark SQL

要以这种凡是使用Spark SQL,需要机遇已有的SparkContext创建出一个HiveContext或者SQLContext。

要开始使用Spark SQL,首先要在程序中添加一些import声明,在Python中SQl的import声明:

#导入Spark SQL
from pyspark.sql import HiveContext, Row
#当不能引入Hive依赖时
from pyspark.sql import SQLContext, Row

当创建好声明后,需要创建出一个HiveContext对象。而如果无法引入Hive依赖,就创建出一个SQLContext对象作为SQL的上下文环境。

在Python中创建上下文环境:

hiveCtx = HiveContext(sc)

要在一张数据表上进行查询,需要滴啊用HiveContext或SQLContext中的SQL方法。

在Python中读取并查询推文

input = hiveCtx.jsonFile(inputFile)
#注册输入的SchemeRDD
input.registerTemplate("tweet")
#依据retweetCount选出推文
topTweets = hiveCtx.sql("""SELECT text, retweetCount FROM tweets ORDER BY retweetCount LIMIT 10""")

读取数据和执行查询都会返回DataFrame,DataFrame和创痛数据库中的表的概念类似,从内部来看,它是一个由Row对象组成的RDD,附带包含每列数据类型的结构信息。

 

9.3 读取和储存数据

9.3.1 Apache Hive

要把Spark SQL连接到依据部署好的Hive上,你需要提供一份Hive配置。你只需要把hive-site.xml文件复制到Spark的./conf/目录下即可。

使用Python从Hive读取

from pyspark.sql import HiveContext

hiveCtx = HiveContext(sc)
rows = hiveCtx.sql("SELECT key, value FROM mytable")
keys = rows.map(lambda row: row[0])

9.3.2 Parquet

Parquet是一种流行的列式存储格式,可以高效地存储具有嵌套字段的记录。

Python中的Parquet数据读取

#从一个由name和favoriteAnimal字段的Parquet文件中读取数据
rows = hiveCtx.parquetFile(parquetFile)
names = rows.map(lambda row: row.name)
print "Everyone"
print names.collect()

Python中的Parquet数据查询

#寻找熊猫爱好者
tbl = rows.registerTemplate("people")
pandaFriends = hiveCtx.sql("SELECT name FROM people WHERE favoriteAnimal = \"panda"\"")
print "Panda Friends"
print pandaFriends.map(lambda row: row.name).collect()

Python中的Parquet文件保存

pandaFriends.saveAsParquetFile("hdfs://...")

9.3.3 JSON

要读取JSON数据,只需要调用hiveCtx中的jsonFile方法即可。

在Python中使用Spark SQL读取JSON数据

input = hiveCtx.jsonFile(inputFile)

9.3.4 基于RDD

在Python中,可以创建一个由Row对象组成的RDD,然后调用inferSchema方法:

happyPeopleRDD = sc.parallelize([Row(name="holden", favouriteBeverage="coffee")])
happyPeopleSchemaRDD = hvieCtx.inferSchema(happyPeopleRDD)
happyPeopleSchemaRDD.registerTemplate("happy_people")

 

9.5 用户自定义函数

用户自定义函数,也叫UDF,可以让我们使用Python注册自定义函数,并在SQL中调用。

9.5.1 Spark SQL UDF

在Scala和Python中,可以利用语言原生的函数和lambda语法的支持,而在Java中,则需要拓展对应的UDF类。

Python版本的字符串长度UDF

#写一个求字符串长度的UDF
hiveCtx.registerFunction("strlenPython", lambda x: len(x), IntegerType())
lengthSchemaRDD = hiveCtx.sql("SELECT strlenPython ('text') FROM tweets LIMIT 10")

9.5.2 Hive UDF

标准的Hive UDF已经自动包含在了Spark SQL中,如果需要支持自定义的Hive UDF,我们要确保该UDF所在的JAR包含已经包含在了应用中。

 

9.6 Spark SQL性能

 

posted @ 2017-01-26 16:24  cyoutetsu  阅读(450)  评论(0编辑  收藏  举报