继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Spark SQL 探索

慕侠2389804
关注TA
已关注
手记 408
粉丝 55
获赞 156

1.环境说明

Hadoop 2.7.1 集群
Spark 2.0.1集群
Hive2.0.1

2. 内容简介

Spark SQL 基本操作

3. 参考文档

本节推荐阅读的理论文章:
3.1 Spark SQL and DataFrame Guide
http://spark.apache.org/docs/latest/sql-programming-guide.html
3.2 Spark入门实战系列--Spark SQL简介
http://www.cnblogs.com/shishanyuan/p/4723604.html

4. 基础知识

4.1 Spark SQL 是什么

Spark SQL是一个支持结构化数据处理的Spark模块。提供DataFrame作为可编程的数据抽象,可以对DataFrame执行SQL的操作。

4.2 DataFrame

DataFrame 是一个分布式的数据集,组织方式采用命名列的形式。类似于关系数据库中的一个表。可以由结构化的数据转换过来,也可以从Hive,外部数据库或者RDD转换。
DataFrame在Spark SQL中,可以使用SQL的方式进行操作,与RDD类似,也采用lazy的方式,只有动作发生时才会真正的执行计算。
DataFrame的数据来源很多样,支持JSON文件,Parquet文件,Hive表格,支持从本地文件系统,HDFS等分布式文件系统,以及S3云存储中读取数据。配合JDBC还可以支持外部关系型数据库。

5. 项目实例

使用Python实现,直接在pyspark上执行。
使用JSON文件作为数据源,创建JSON文件/home/cms/courses.json,并输入下面的内容:
{"name":"Linux", "type":"basic", "length":10}
{"name":"TCPIP", "type":"project", "length":15}
{"name":"Python", "type":"project", "length":8}
{"name":"GO", "type":"basic", "length":2}
{"name":"Ruby", "type":"basic", "length":5}
其中每个数据项的意思:
name:课程名称
type:课程类型,包括基础课(basic),项目课(project)
length:课程长度,即包含的实验数量
打开终端,输入下面命令启动pyspark:
$ MASTER=spark://master:7077 pyspark
如果下载的是二进制版本的spark,已经在编译时添加了hive的支持。当使用spark SQL编程时,根据是否使用hive的支持,有两个不同的入口。推荐使用的入口是HiveContext,它可以提供HiveQL以及其他依赖于hive的功能支持。较为基础的是SQLContext则为支持Spark sql功能的一个子集,子集去掉了需要依赖于hive的功能。这种分离主要是为了那些可能因为引入hive的全部依赖而陷入依赖冲突的用户设计的。使用HiveContext不需要事先部署好Hive.

5.1 创建SQLContext对象

首先使用SQLContext模块,这个模块的作用是提供Spark SQL处理的功能。
在pyspark shell中逐步输入下面步骤的内容:

# 引入pyspark.sql中的SQLContextfrom pyspark.sql import SQLContext# 使用pyspark的SparkContext对象,创建SQLContext对象sqlContext = SQLContext(sc)```#####5.1.1 创建DataFrames对象DataFrames对象可以由RDD创建,也可以从Hive表或JSON文件等数据源创建。
```# 创建DataFrames,指明来源自JSON文件df = sqlContext.read.json("/home/shiyanlou/courses.json")```#####5.1.2 打印信息首先打印当前DataFrame里的内容:

df.show()

show()函数将打印出JSON文件中存储的数据表。
使用printSchema()函数打印数据表的Schema:

df.printSchema()

如果没有使用部署好的hive,spark SQL 会在当前目录中创建出自己的Hive元数据仓库,metastore_db#####5.1.3 select 操作

展示所有的课程名:

df.select("name").show()

展示所有的课程名及课程长度:

df.select("name", "length").show()

#####5.1.4 filter 操作展示所有基础课,打印出课程名称:
df.filter(df['type'] == 'basic').select('name', 'type').show()#####5.1.5 groupBy 和 count() 操作计算所有基础课和项目课的数量:

df.groupBy("type").count().show()

#####5.1.6 执行SQL语句
首先需要将DataFrame注册为Table才可以在该表上执行SQL语句:

df.registerTempTable('courses')

查询课程长度在5-10之间的课程,将返回一个新的RDD,支持所有RDD的操作,希望你还没有忘记 :) :

coursesRDD = sqlContext.sql("SELECT name FROM courses WHERE length >= 5 and length <= 10")

names = coursesRDD.rdd.map(lambda p: "Name: " + p.name)
for name in names.collect():
print name

#####5.1.7 保存 DataFrame 为其他格式parquet 是Spark SQL读取的默认数据文件格式,我们把先前从JSON中读取的DataFrame保存为这种格式,只保存课程名称和长度两项数据:

df.select("name", "length").write.save("/tmp/courses.parquet", format="parquet")

Hdfs://master:9000/tmp/courses.parquet文件夹被创建并存入课程名称和长度数据,可以查看文件夹下的内容:####5.2创建HiveContext对象重复上面几个步骤

from pyspark.sql import HiveContext,Row
hiveCtx=HiveContext(sc)  #创建一个HiveContext对象
input=hiveCtx.read.json("/tmp/courses.json")
input.show()
input.printSchema()
input.filter(input['type']=='basic').select("name","type").show()
input.groupBy("type").count().show()
input.registerTempTable("courses")
coursesRDD=hiveCtx.sql("SELECT name FROM courses WHERE length>=5 and length <=10")
course1=coursesRDD.rdd.map(lambda x:x.name)
input.write.save("/tmp/names.parquet", format="parquet")

####5.3将普通的RDD转化为DataFrameRDD使用createDataFrame()函数

//RDD转化为DataFramRDD
pepleRDD=sc.parallelize([Row(name="cms",age=24),Row(name="yjb",age=25),Row(name="cmt",age=26)])
pepledataRDD=spark.createDataFrame(pepleRDD)
pepledataRDD.registerTempTable("peoples")
ageRDD=hiveCtx.sql("SELECT name,age FROM peoples WHERE age>=25")
ageRDD.collect()

####5.4 UDFUDF,用户自定义函数,通常用来给机构内的SQL用户们提供高级功能支持,这样这些用户就可以直接调用注册的函数而无需自己去用编程实现。
例子:一个用来计算字符串长度的非常简易的UDF

//spark SQL udf
hiveCtx.registerFunction("strLen",lambda x:len(x))
lenRDD=hiveCtx.sql("SELECT strLen(name) FROM peoples")

####5.5使用已经部署好的Hive可用已经部署好的hive
将你的hive-site.xml文件复制到$SPARK_HOME/conf目录下,就可以使用hiveCtx.sql来查询已有的Hive表。#####5.4.1 新建sparkSQL.py

from pyspark.sql import HiveContext
from pyspark import SparkContext, SparkConf
appName="shashibiya"
conf=SparkConf().setAppName(appName).setMaster("local")
sc = SparkContext(conf=conf)
hiveCtx=HiveContext(sc)
RDD=hiveCtx.sql("SELECT * FROM test1") #已有的hive表
print(RDD.collect())

#####5.4.2 启动hive服务

hive --service metastore &

#####5.4.3 提交应用
提交应用的时候,如果报错,可以提交jar和hive-site.xml

spark-submit --files /home/cms/spark-2.0.1-bin-hadoop2.7/conf/hive-site.xml --jars /home/cms/hive/lib/mysql-connector-java-5.1.36-bin.jar sparkSQL.py 2> error_log.txt




作者:玄月府的小妖在debug
链接:https://www.jianshu.com/p/025a07102e7d


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP