sparkSQL笔记

Spark为结构化数据处理引入了一个称为Spark SQL的编程模块。它提供了一个称为DataFrame的编程抽象,并且可以充当分布式SQL查询引擎。

SparkSQL具有以下的几个特点:

  1. 集成

无缝地将SQL查询与Spark程序混合。 Spark SQL允许您将结构化数据作为Spark中的分布式数据集(RDD)进行查询,在Python,Scala和Java中集成了API。这种紧密的集成使得可以轻松地运行SQL查询以及复杂的分析算法。

  1. 统一数据访问

加载和查询来自各种来源的数据。 Schema-RDDs提供了一个有效处理结构化数据的单一接口,包括Apache Hive表,Parquet文件和JSON文件。

  1. Hive兼容性

在现有仓库上运行未修改的Hive查询。 Spark SQL重用了Hive前端和MetaStore,为您提供与现有Hive数据,查询和UDF的完全兼容性。只需将其与Hive一起安装即可。

  1. 标准连接

通过JDBC或ODBC连接。 Spark SQL包括具有行业标准JDBC和ODBC连接的服务器模式。

  1. 可扩展性

对于交互式查询和长查询使用相同的引擎。 Spark SQL利用RDD模型来支持中查询容错,使其能够扩展到大型作业。不要担心为历史数据使用不同的引擎。

SparkSQL的体系结构:

尝试操作SparkSQL

启动spark的相关服务:

$SPARK_HOME/sbin/start-all.sh

进入到spark命令行模式:

spark-shell

SQLContext是一个类,用于初始化Spark SQL的功能。初始化SQLContext类对象需要SparkContext类对象(sc)。

我们可以先来初始化一个SparkContext。

首先我们创建一个emp.json的JSON文件,里面是员工基本信息。

使用以下命令创建DataFrame(df)并读取名为employee.json的JSON文档,并具有以下内容。

spark读取的默认路径在hdfs://localhost:8020/user/root/

我们将这个emp.json文件上传到这里去。

通过命令来读取JSON文件:

查看数据框的内容:

查看这个DataFrame的数据结构:

指定字段查看表格数据:

使用过滤器筛选数据:

对表格数据进行group by的分组计算:

查询最低工资等于3000的部门编号是多少?

val g = dfs.groupBy("deptno").min("salary")

g.filter(g("min(salary)")===3000).select("deptno").show()

SQLContext使应用程序能够在运行SQL函数时以编程方式运行SQL查询,并将结果作为DataFrame返回。
通常,在后台,SparkSQL支持两种不同的方法将现有的RDD转换为DataFrames。

1. 使用反射来推断模式

在spark创建一个和表格字段类型一致的类,将数据按照类的参数一一对应的进行数据的写入。

例如现在我们要读取和操作一个emp.txt文件的数据:

第一步我们先需要导入一个SparkSession的包,SparkSession 类是到 Spark SQL 所有功能的入口点

然后我们初始化一个spark对象:

使用命令导入用于将RDD隐式转换为DataFrame的所有SQL函数:

定义case class:

我们必须使用案例类定义员工记录数据的模式。 下面的命令是用于根据给定数据(例如empno,ename,salary,deptno)来声明Case Class。

使用命令读取数据emp.txt文件,并使用Map函数将其转换为DataFrame:
这里,定义了两个映射函数。 一个是将文本记录分割成字段 (.map(_.split(","))) ;

第二个映射函数用于将单个字段(empno,ename,salary,deptno)转换为一个case类对象 e(0).trim.toInt, e(1), e(2).trim.toInt, e(3).trim.toInt;
最后,toDF() 方法用于将具有模式的案例类对象转换为DataFrame。

现在已经可以查看这个文件对应的表格数据了:

接下来我们需要将这个DataFrame的数据存储到表格里面:

然后我们就可以在这个表格中通过sql语句进行查询了,查询结果用 show() 来展示:

再来一个开窗函数的例子:

使用 show() 这是通过DataFrame的方式来传递显示数据的,我们也可以通过 Transform 的方式来读取数据:

2. 以编程方式指定模式

第二种创建DataFrame的方法是通过编程接口,自己来构造一个模式,然后将其应用到现有的RDD中。 我们可以使用以下三个步骤以编程的方式创建一个DataFrame。
我们继续来使用刚才创建好的emp.txt文件:

我们先创建一个SQLContext的对象:

读取emp.txt文件并且去创建RDD DataFrame:

以字符串格式创建编码模式,我们在这个构建一个表格结构,并且添加上字段分隔符信息:

导入需要的API,我们把行功能还有数据类型导入了进来:

我们通过读取schemaString变量来生成模式。 这表示我们需要通过将整个字符串以空格作为分隔符来读取每个字段,并且默认情况下,每个字段类型为String类型:

通过下面的命令,将emp表格转换成行格式的Rows,这里的两个map和前面使用过的一样,第一个map拆分字段,第二个map定义字段数据:

基于模式在Rows格式的行数据中应用RowRDD,使用以下语句通过使用rowRDD和模式(SCHEMA)变量创建DataFrame:

将数据帧存储到表格中,并且命名为emp02表:

对存储的表格进行数据查询:

数据源的格式

1. JSON数据源

我们可以直接将读取到的 json 文件的数据存储为一个表格,也可以读取一个 txt 的文本文档格式,然后使用 spark sql 对其进行查询,这两点我们上面都有使用过了:

2. HIVE数据源

因为我这里用的是mysql最为hive的元数据库的,所以在打开spark-shell命令行窗口的时候,需要添加 mysql 的驱动 jar 包:

先实例化一个hive数据连接的实例化对象:

我们可以通过 hive sql 来查看是否成功连接了数据库:

然后我们来往bigdata这个hive库中创建表格:

我们通过 load data 的方式来导入数据看看:

通过 hive sql 查询刚才导入的表格:

3. Parquet文件的操作

Parquet是一种柱状格式,由许多数据处理系统支持。 具有柱状存储的优点如下 :

  • 列存储限制IO操作;
  • 列式存储可以获取您需要访问的特定列;
  • 列式存储占用更少的空间;
  • 列式存储提供更好的摘要数据,并遵循类型特定的编码。

SparkSQL提供对读取和写入parquet文件的支持,像JSON数据集一样,parquet文件遵循相同的过程。

我们可以先看看将spark中获取的数据导出成一个parquet文件,使用 write.parquet 方法即可:

下载这个导出文件可以看到里面的文件格式和内容:

SparkSQL操作 parquet 文件的步骤和之前的步骤是一样的,先初始化一个 SQLContext 实例:

这里注意,我们读取的是 parquet 的整个文件夹,它是一个目录结构,parquet 文件是由多个部分拼凑而成的:

将读取的 parquet 文件存储为一个表格:

最后可以通过 hive sql 来对表格进行查询:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一鸣888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值