1、相关介绍

Datasets:一个 Dataset 是一个分布式的数据集合 Dataset 是在 Spark 1.6 中被添加的新接口, 它提供了 RDD 的优点(强类型化, 能够使用强大的 lambda 函数)与Spark SQL执行引擎的优点。

DataFrame: 一个 DataFrame 是一个 Dataset 组成的指定列。、

SparkSession: Spark SQL中所有功能的入口点是 SparkSession 类,要创建一个 SparkSession, 使用 SparkSession.builder()就可以。

需要注意的是:

import spark.implicits._
//这里的spark是SparkSession的变量名

对DataFrame和Dataset进行操作许多操作都需要这个包进行支持。DataFrames可以从多种数据源创建,例如:结构化数据文件(JSON)、Hive中的表、外部数据库或者已存在的RDDs。

2、入门

(1)Json

准备json文件

{"id":1,"age":15,"name":"zhangsan"},
{"id":2,"age":13,"name":"zhangsi"},
{"id":3,"age":14,"name":"zhangwu"}

读取json文件

java版

public class SQLJava {
public static void main(String[] args) {
SparkSession session = SparkSession.builder()
.appName("SQLJava")
.config("spark.master","local")
.getOrCreate(); Dataset<Row> df1 = session.read().json("file:///f:/spark/info.json");
df1.show();
df1.printSchema(); //创建临时视图
df1.createOrReplaceTempView("customers");
//按照sql方式查询
Dataset<Row> df2 = session.sql("select * from customers where age > 13");
df2.show();
System.out.println("================="); //聚合查询
Dataset<Row> dfCount = session.sql("select count(1) from customers");
dfCount.show(); //DataFrame和RDD互操作
JavaRDD<Row> rdd = df1.toJavaRDD();
rdd.collect().forEach(new Consumer<Row>() {
public void accept(Row row) {
long age = row.getLong(0);
long id = row.getLong(1);
String name = row.getString(2);
System.out.println(age + "," + id + "," + name);
}
}); //保存处理,设置保存模式
df2.write().mode(SaveMode.Append).json("file:///f:/spark/json/out.dat");
}

Scala版

object SparkSql {
def main(args: Array[String]): Unit = {
val session=SparkSession.builder()
.appName("AQLScala")
.config("spark.master","local")
.getOrCreate()
val df1=session.read.json("file:///f:/spark/info.json")
df1.show()
df1.printSchema()
//创建视图
df1.createOrReplaceTempView("customers")
val df2 = session.sql("select * from customers where age >13")
df2.show() //聚合操作
val df3 = session.sql("select count(*) from customers")
df3.show() //DataFrame和RDD互操作
df1.rdd.map(e=>{
"id="+e(e.fieldIndex("id"))+"\tname="+e(e.fieldIndex("name"))+"\tage="+e(e.fieldIndex("age"))
}).foreach(println(_)) df1.write.mode(SaveMode.Append).json("file:///f:/spark/json/out.dat")
}

部分输出

还要注意的就是Save Modes : Save operations (保存操作)可以选择使用 SaveMode , 它指定如何处理现有数据如果存在的话. 重要的是要意识到, 这些 save modes (保存模式)不使用任何 locking (锁定)并且不是 atomic (原子). 另外, 当执行 Overwrite 时, 数据将在新数据写出之前被删除.

Spark SQL中的临时视图是session级别的, 也就是会随着session的消失而消失. 如果你想让一个临时视图在所有session中相互传递并且可用, 直到Spark 应用退出, 你可以建立一个全局的临时视图.

(2)jdbc

java代码

public class SQLJDBCJava1 {
public static void main(String[] args) {
SparkSession session = SparkSession.builder()
.appName("SQLJava")
.config("spark.master","local")
.getOrCreate();
String url = "jdbc:mysql://localhost:3306/mybatis" ;
//要查询的数据库中的表
String table = "users" ;
//查询数据库
Dataset<Row> df = session.read()
.format("jdbc")
.option("url", url)
.option("dbtable", table)
.option("user", "root")
.option("password", "root")
.option("driver", "com.mysql.jdbc.Driver")
.load();
df.show();
//投影查询
Dataset<Row> df2 = df.select(new Column("name"),new Column("age"));
//过滤
df2 = df2.where("age > 13");
df2.show();
//去重
df2 = df2.distinct();
df2.show();
//
Properties prop = new Properties();
prop.put("user", "root");
prop.put("password", "root");
prop.put("driver", "com.mysql.jdbc.Driver");
//写入数据库中 subpersons为表
df2.write().jdbc(url,"subpersons",prop);
df2.show();
}
}

scala代码

object SQLJdbc {
def main(args: Array[String]): Unit = {
val session=SparkSession.builder()
.config("spark.master","local")
.appName("SQLJdbc")
.getOrCreate()
val url="jdbc:mysql://localhost:3306/mybatis"
//要查询的数据库中的表
val table="users"
//连接属性
val df=session.read
.format("jdbc")
.option("url", url)
.option("dbtable", table)
.option("user", "root")
.option("password", "root")
.option("driver", "com.mysql.jdbc.Driver")
.load()
df.show()
println("===============")
val df2=df.select(new Column("name"),new Column("age"))
df2.where("name like 't%'")
df2.show()
//数据库的连接属性
val prop = new Properties()
prop.put("user", "root")
prop.put("password", "root")
prop.put("driver", "com.mysql.jdbc.Driver")
//写入数据库中 subpersons为表
df2.write.jdbc(url, "subpersons", prop)
df2.show()
}
}

(3)Hive

Spark SQL 还支持读取和写入存储在 Apache Hive 中的数据。但是,由于 Hive 具有大量依赖关系,因此这些依赖关系不包含在默认 Spark 分发中。 如果在类路径中找到 Hive 依赖项,Spark 将自动加载它们。 请注意,这些 Hive 依赖关系也必须存在于所有工作节点上,因为它们将需要访问 Hive 序列化和反序列化库 (SerDes),以访问存储在 Hive 中的数据。

通过将 hive-site.xml, core-site.xml(用于安全配置)和 hdfs-site.xml (用于 HDFS 配置)文件放在 conf/ 中来完成配置。

启动hiveserver2服务器,监听端口是10000 ——-进入hive/bin下,启动hiveserver2,或者采用命令

hive –service hiveserver2 & 来启动,(通过hive-jdbc驱动程序采用jdbc方式远程访问远程数据仓库

但是我按照文档上的方法没有成功,采用以下的方法实现了

java版本

public class SQLHiveJava {
public static void main(String[] args) throws Exception {
Class.forName("org.apache.hive.jdbc.HiveDriver");
Connection conn = DriverManager.getConnection("jdbc:hive2://s201:10000");
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select * from mydb.t1 where age > 13");
while(rs.next()){
int id=rs.getInt(1);
String name=rs.getString(2);
int age=rs.getInt(3);
System.out.println(id+","+name+","+age);
}
rs.close();
}
}

scala版本

object SparkSqlHive {
def main(args: Array[String]): Unit = {
Class.forName("org.apache.hive.jdbc.HiveDriver")
val conn = DriverManager.getConnection("jdbc:hive2://s201:10000")
//创建上下文
val stat = conn.createStatement()
//结果
val resultSet = stat.executeQuery("select * from mydb.t1 where age > 13")
while ( resultSet.next) {
val id = resultSet.getInt(1)
val name = resultSet.getString(2)
val age = resultSet.getInt(3)
println(id + "," + name + "," + age)
}
resultSet.close()
}
}

输出结果:

注意:通过远程jdbc方式连接到hive数据仓库

(1)首先启动hiveserver2服务器,监听端口10000

(2)通过beeline命令行连接到hiveserver2 (进入beeline命令行 hive –service beeline

通过命令 !connect jdbc:hive2://localhost:10000/mydb 连接到数据库

如图:

Spark基础:(六)Spark SQL的更多相关文章

  1. Spark 基础操作

    1. Spark 基础 2. Spark Core 3. Spark SQL 4. Spark Streaming 5. Spark 内核机制 6. Spark 性能调优 1. Spark 基础 1. ...

  2. spark基础知识(1)

    一.大数据架构 并发计算: 并行计算: 很少会说并发计算,一般都是说并行计算,但是并行计算用的是并发技术.并发更偏向于底层.并发通常指的是单机上的并发运行,通过多线程来实现.而并行计算的范围更广,他是 ...

  3. 最全的spark基础知识解答

    原文:http://www.36dsj.com/archives/61155 一. Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduc ...

  4. Spark学习之Spark SQL

    一.简介 Spark SQL 提供了以下三大功能. (1) Spark SQL 可以从各种结构化数据源(例如 JSON.Hive.Parquet 等)中读取数据. (2) Spark SQL 不仅支持 ...

  5. spark基础知识介绍2

    dataframe以RDD为基础的分布式数据集,与RDD的区别是,带有Schema元数据,即DF所表示的二维表数据集的每一列带有名称和类型,好处:精简代码:提升执行效率:减少数据读取; 如果不配置sp ...

  6. spark基础知识介绍(包含foreachPartition写入mysql)

    数据本地性 数据计算尽可能在数据所在的节点上运行,这样可以减少数据在网络上的传输,毕竟移动计算比移动数据代价小很多.进一步看,数据如果在运行节点的内存中,就能够进一步减少磁盘的I/O的传输.在spar ...

  7. spark第六篇:Spark Streaming Programming Guide

    预览 Spark Streaming是Spark核心API的扩展,支持高扩展,高吞吐量,实时数据流的容错流处理.数据可以从Kafka,Flume或TCP socket等许多来源获取,并且可以使用复杂的 ...

  8. Spark基础学习精髓——第一篇

    Spark基础学习精髓 1 Spark与大数据 1.1 大数据基础 1.1.1 大数据特点 存储空间大 数据量大 计算量大 1.1.2 大数据开发通用步骤及其对应的技术 大数据采集->大数据预处 ...

  9. Spark基础知识详解

    Apache Spark是一种快速通用的集群计算系统. 它提供Java,Scala,Python和R中的高级API,以及支持通用执行图的优化引擎. 它还支持一组丰富的高级工具,包括用于SQL和结构化数 ...

  10. 大数据技术之_19_Spark学习_01_Spark 基础解析 + Spark 概述 + Spark 集群安装 + 执行 Spark 程序

    第1章 Spark 概述1.1 什么是 Spark1.2 Spark 特点1.3 Spark 的用户和用途第2章 Spark 集群安装2.1 集群角色2.2 机器准备2.3 下载 Spark 安装包2 ...

随机推荐

  1. X264编码测试验证

    之前在做一个rtsp直播需求,其中一个方案是要用的x264来对摄像头数据进行实时编码推流,摄像头帧率是25fps,为了验证方案的可行性,先对x264的编码速度进行一个测试研究,再确认是否要采用此方案. ...

  2. Python import Queue ImportError: No module named 'Queue'

    python3 中引入Queue 会报出这个问题 python3 中这样引入 import queue python2 中这样引入 import Queue 为了兼容 可以这样 import sys ...

  3. poj 1129 Channel Allocation(图着色,DFS)

    题意: N个中继站,相邻的中继站频道不得相同,问最少需要几个频道. 输入输出: Sample Input 2 A: B: 4 A:BC B:ACD C:ABD D:BC 4 A:BCD B:ACD C ...

  4. Zabbix5.0实现监控系统登陆失败告警

    环境zabbix5.0,配置思路,通过添加监控项和触发器实现,监控项监控对应的日志文件,触发器过滤日志文件中的关键字,当出现failed时就发出告警. 监控项配置 类型选择zabbix客户端主动式,键 ...

  5. sudo user1账号获得管理员root的权限

    user1虽然有sudo权限,但不是真正的root权限,修改内核参数之类的就做不了 但是有sudo权限就可以添加账号,以下添加了admin账号与root账号一样的权限 useradd -u 0   - ...

  6. Get value from agent failed: cannot connect to [[192.168.8.102]:10050]: [113] No route to host

    192.168.8.102主机down掉,开机就可以

  7. Kubernetes Deployment 源码分析(二)

    概述startDeploymentController 入口逻辑DeploymentController 对象DeploymentController 类型定义DeploymentController ...

  8. Linux 下权限的管理

    Linux 下权限的管理 我们都知道,Linux系统对于用户的权限管理是十分严格的. 那么,我们就来具体了解一下. 一. 用户 在Linux中按照类型用户分为两种:1.超级用户 2.普通用户 那么它们 ...

  9. Rancher 下图形界面 搭建 K8S 集群

    首先我们准备4台 2核3G 的 centos 7 温馨提示:先安装好一台 CentOS 的虚拟机,并且安装好 docker,永久关闭防火墙. 再这个基础上我们分别克隆出四台 Rancher.K8S1. ...

  10. python 字符串和时间格式(datetime)相互转换-

    2019-03-17 11:00:00格式转化 import datetime # str转时间格式: dd = '2019-03-17 11:00:00' dd = datetime.datetim ...