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. ansible安装和批量执行命令

    yum install -y ansible 编辑 /etc/ansible/hosts 文件 # This is the default ansible 'hosts' file.## It sho ...

  2. 【动图解释】关系数据库de关系代数小记

    本文章在 Github 撰写,同时在 我的博客 进行了发布. 最近学数据库概论学到了关系数据库的关系代数了.哎嘛,真的把我整晕了,尤其是关系代数的使用,很容易让人被蒙在鼓里. 对我来说槽点最大的莫过于 ...

  3. Centos8上安装Mysql8.X

    一.下载Mysql 下载地址:https://dev.mysql.com/downloads/mysql/ 二.将压缩包通过ftp软件服务器的目标位置:并解压 1.我的是放在:/root/softwa ...

  4. BootStrap_1 浓缩版本

    BootStrap(基于JQuery框架) 商业互吹:Bootstrap是最受欢迎的HTML.CSS和JS框架,用于开发响应式布局,移动设备优先选择的WEB项目... 特色:1.响应式布局 2.基于f ...

  5. Debug代码调试

    Debug代码调试 第一步在代码左侧先点一个红点 第二步右键选择Debug运行 第三步点击Step Into按键分步进行 练习题: s2 = 'python python python python ...

  6. LOTO示波器实测——光照强度传感器

    loto最近推出了很多的周边传感器模块的实测案例,本文介绍和演示LOTO示波器实测光照强度传感器的使用. 下图就是主角感光模块,可以用来测量光照强度. 这个模块也很简单,只有3个引脚,一个电源,3.3 ...

  7. 从华为新发布的WeAutomate 3.0,看RPA如何在政企领域落地生长

    文/王吉伟 11月11日,是电商的重要节日.即便今年双11的气氛不如往年浓烈,人们依旧关注双11厂商战报,关注购物车里的商品有没有降价. 当然在RPA领域,大家除了关注双11的商品价格,更关注华为RP ...

  8. Go语言核心36讲(Go语言实战与应用七)--学习笔记

    29 | 原子操作(上) 我们在前两篇文章中讨论了互斥锁.读写锁以及基于它们的条件变量,先来总结一下. 互斥锁是一个很有用的同步工具,它可以保证每一时刻进入临界区的 goroutine 只有一个.读写 ...

  9. [cf1209E]Rotate Columns

    题意也可以理解为这样一个过程: 对于每一列,将其旋转后选出若干行上的数,要求与之前的行都不同 用$g_{i,S}$表示第$i$列选出的行数集合为$S$的最大和,$f_{i,S}$表示前$i$列$S$中 ...

  10. [SVN] Branch and Tag

    在 SVN 中,如何建立分支以及如何标记Tag. 右键要处理的文件夹,选择 "TortoiseSVN" - "Branch/tag...",进入下面界面: To ...