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. [转]浅谈电路设计中应用DDR3处理缓存问题

    本文转自:浅谈电路设计中应用DDR3处理缓存问题_若海人生的专栏-CSDN博客 DDR系列SDRAM存储芯片的高速率.高集成度和低成本使其理所当然成为存储芯片中的一霸.在PC和消费电子领域自是如此,它 ...

  2. hdu 2586 How far away? (LCA模板)

    题意: N个点,形成一棵树,边有长度. M个询问,每个询问(a,b),询问a和b的距离 思路: 模板题,看代码.DFS预处理算出每个结点离根结点的距离. 注意: qhead[maxn],而不是qhea ...

  3. Linux&C open creat read write lseek 函数用法总结

    一:五个函数的参数以及返回值. 函数                                 参数                      返回值     open (文件名,打开方式以及读 ...

  4. Sentinel-Go 源码系列(二)|初始化流程和责任链设计模式

    上节中我们知道了 Sentinel-Go 大概能做什么事情,最简单的例子如何跑起来 其实我早就写好了本系列的第二篇,但迟迟没有发布,感觉光初始化流程显得有些单一,于是又补充了责任链模式,二合一,内容显 ...

  5. 3组-Alpha冲刺-3/6

    一.基本情况 队名:发际线和我作队 组长博客:链接 小组人数:10 二.冲刺概况汇报 黄新成(组长) 过去两天完成了哪些任务 文字描述 使用labelimg工具对采集的数据进行标注,安装alphapo ...

  6. Alpha冲刺.2李霆政

    一.基本情况 队名:不行就摆了吧 组长博客:https://www.cnblogs.com/Microsoft-hc/p/15534079.html 小组人数: 8 二.冲刺概况汇报 谢小龙 过去两天 ...

  7. 在linux 环境下 安装php

    最近打算学写一个php 脚本~ 到了虚拟机环境上发现~没有环境. 只有老老实实去装一个php环境咯. 第一步 去官网下一个包 记得一定要下载tgz格式的 第二步~当然是传上虚拟机上咯~任意目录都可以. ...

  8. Effective C++ 总结笔记(二)

    二.构造/析构/赋值运算 05.了解C++默默编写并调用那些函数 如果自己不声明, 编译器就会暗自为class创建一个default构造函数.一个copy构造函数.一个copy assignment操 ...

  9. 如何正确的找BUG

    什么是BUG 漏洞是在硬件.软件.协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统.具体举例来说,比如在Intel Pentium芯片中存在的逻辑错误,在S ...

  10. PAT A1103—DFS

     Integer Factorization The K−P factorization of a positive integer N is to write N as the sum of the ...