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性能