0. 说明

  DataSet 介绍 && Spark SQL 访问 JSON 文件 && Spark SQL 访问 Parquet 文件 && Spark SQL 访问 JDBC 数据库 && Spark SQL 作为分布式查询引擎


1. DataSet 介绍

  强类型集合,可以转换成并行计算。

  Dataset 上可以执行的操作分为 Transfermation 和 Action ,类似于 RDD。

  Transfermation 生成新的 DataSet,Action 执行计算并返回结果。

  DataSet 是延迟计算,只有当调用 Action 时才会触发执行。内部表现为逻辑计划。

  Action 调用时,Spark 的查询优化器对逻辑计划进行优化,生成物理计划,用于分布式行为下高效的执行。

  具体的执行计划可以通过 explain函数 来查看,方式如下:

  1. scala> spark.sql("explain select name,class,score from tb_student").show(,false)

  结果如图所示,show(1000 , false) 表示显式 1000行数据,结果不截断显式。

  


2. Spark SQL 访问 JSON 文件

  【保存 JSON 文件】

  1. # 创建 DataFrame
  2. scala> val df = spark.sql("select * from orders")
  3.  
  4. # 输出 JSON 文件
  5. scala> df.write.json("file:///home/centos/json")

  

  【读取 JSON 文件】

  1. scala> val df = spark.read.json("file:///home/centos/json")
  2.  
  3. scala> df.show

  


3. Spark SQL 访问 Parquet 文件

  【保存】

  1. # 创建 DataFrame
  2. scala> val df = spark.sql("select * from orders")
  3.  
  4. # 保存成 parquet 文件
  5. scala> df.write.parquet("file:///home/centos/par")

  【读取】

  1. # 创建 DataFrame
  2. scala> val df = spark.read.parquet("file:///home/centos/par")
  3.  
  4. # 读取 Parquet 文件
  5. scala> df.show

  


4. Spark SQL 访问 JDBC 数据库

  【4.1 处理第三方 jar】

  spark SQL 是分布式数据库访问,需要将驱动程序分发到所有 worker 节点或者通过 --jars 命令指定附件

  分发 jar 到所有节点 ,third.jar 为第三方 jar 包

  1. xsync /soft/spark/jars/third.jar

  通过--jars 命令指定

  1. spark-shell --master spark://s101:7077 --jars /soft/spark/jars/third.jar

  【4.2 读取 MySQL 数据】

  1. val prop = new java.util.Properties()
  2. prop.put("driver" , "com.mysql.jdbc.Driver")
  3. prop.put("user" , "root")
  4. prop.put("password" , "root")
  5. # 读取
  6. val df = spark.read.jdbc("jdbc:mysql://192.168.23.101:3306/big12" , "music" ,prop) ;
  7. # 显示
  8. df.show

  【4.3 保存数据到 MySQL 表(表不能存在)】

  1. val prop = new java.util.Properties()
  2. prop.put("driver" , "com.mysql.jdbc.Driver")
  3. prop.put("user" , "root")
  4. prop.put("password" , "root")
  5. # 保存
  6. dataframe.write.jdbc("jdbc:mysql://192.168.231.1:3306/mydb" , "emp" ,prop ) ;

5. Spark SQL 作为分布式查询引擎

  【5.1 说明】
  终端用户或应用程序可以直接同 Spark SQL 交互,而不需要写其他代码。

  

  【5.2 启动 Spark的 thrift-server 进程】

  在 spark/sbin 目录下执行以下操作

  1. [centos@s101 /soft/spark/sbin]$ start-thriftserver.sh --master spark://s101:7077

  【5.3 验证】

  查看 Spark WebUI,访问 http://s101:8080

  端口检查,检查10000端口是否启动

  1. netstat -anop | grep

  【5.4 使用 Spark 的 beeline 程序测试】

  在 spark/bin 目录下执行以下操作

  1. # 进入 Spark 的 beeline
  2. [centos@s101 /soft/spark/bin]$ ./beeline
  3.  
  4. # 连接 Hive
  5. !connect jdbc:hive2://localhost:10000/big12;auth=noSasl
  6.  
  7. # 查看表
  8. : jdbc:hive2://localhost:10000/big12> show tables;

  【5.5 编写客户端 Java 程序与 Spark 分布式查询引擎交互】

    [添加依赖]

  1. <dependency>
  2. <groupId>org.apache.hive</groupId>
  3. <artifactId>hive-exec</artifactId>
  4. <version>2.1.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.hive</groupId>
  8. <artifactId>hive-jdbc</artifactId>
  9. <version>2.1.0</version>
  10. </dependency>

    [代码编写]

  1. package com.share.sparksql;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.ResultSet;
  6.  
  7. /**
  8. * 使用 Spark SQL 分布式查询引擎
  9. */
  10. public class ThriftServerDemo {
  11. public static void main(String[] args) {
  12. try {
  13. Class.forName("org.apache.hive.jdbc.HiveDriver");
  14. Connection connection = DriverManager.getConnection("jdbc:hive2://s101:10000/big12;auth=noSasl");
  15. ResultSet rs = connection.createStatement().executeQuery("select * from orders");
  16. while (rs.next()) {
  17. System.out.printf("%d / %s\r\n", rs.getInt(1), rs.getString(2));
  18. }
  19. rs.close();
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }

    [特别说明]

    以上黄色部分为 HiveServer2 的验证模式,如果未添加以上黄色部分则会报错,报错如下:

  


[Spark SQL_3] Spark SQL 高级操作的更多相关文章

  1. 大数据学习day25------spark08-----1. 读取数据库的形式创建DataFrame 2. Parquet格式的数据源 3. Orc格式的数据源 4.spark_sql整合hive 5.在IDEA中编写spark程序(用来操作hive) 6. SQL风格和DSL风格以及RDD的形式计算连续登陆三天的用户

    1. 读取数据库的形式创建DataFrame DataFrameFromJDBC object DataFrameFromJDBC { def main(args: Array[String]): U ...

  2. 【转】【技术博客】Spark性能优化指南——高级篇

    http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745207&idx=1&sn=3d70d59cede236e ...

  3. Spark性能优化指南——高级篇

    本文转载自:https://tech.meituan.com/spark-tuning-pro.html 美团技术点评团队) Spark性能优化指南——高级篇 李雪蕤 ·2016-05-12 14:4 ...

  4. 大数据技术之_27_电商平台数据分析项目_02_预备知识 + Scala + Spark Core + Spark SQL + Spark Streaming + Java 对象池

    第0章 预备知识0.1 Scala0.1.1 Scala 操作符0.1.2 拉链操作0.2 Spark Core0.2.1 Spark RDD 持久化0.2.2 Spark 共享变量0.3 Spark ...

  5. 小记---------spark组件与其他组件的比较 spark/mapreduce ;spark sql/hive ; spark streaming/storm

    Spark与Hadoop的对比   Scala是Spark的主要编程语言,但Spark还支持Java.Python.R作为编程语言 Hadoop的编程语言是Java    

  6. [Spark] 05 - Spark SQL

    关于Spark SQL,首先会想到一个问题:Apache Hive vs Apache Spark SQL – 13 Amazing Differences Hive has been known t ...

  7. Hive on Spark和Spark sql on Hive,你能分的清楚么

    摘要:结构上Hive On Spark和SparkSQL都是一个翻译层,把一个SQL翻译成分布式可执行的Spark程序. 本文分享自华为云社区<Hive on Spark和Spark sql o ...

  8. Spark 键值对RDD操作

    键值对的RDD操作与基本RDD操作一样,只是操作的元素由基本类型改为二元组. 概述 键值对RDD是Spark操作中最常用的RDD,它是很多程序的构成要素,因为他们提供了并行操作各个键或跨界点重新进行数 ...

  9. spark中RDD的转化操作和行动操作

    本文主要是讲解spark里RDD的基础操作.RDD是spark特有的数据模型,谈到RDD就会提到什么弹性分布式数据集,什么有向无环图,本文暂时不去展开这些高深概念,在阅读本文时候,大家可以就把RDD当 ...

随机推荐

  1. postgresql 清空数据表数据

    在 mysql中,只需要执行: TRUNCATE table_name; 即可,数据会情况,而且自增id也会变回0: 但在 postgresql 则稍有不同,因为 postgresql 的自增id是通 ...

  2. 关于Mybatis与Spring整合之后SqlSession与mapper对象之间数量的问题。

    1,sqlsession的真实类型和数量 由于使用spring管理bean,当我们在代码中需要使用这个bean的时候,会首先去容器中找,第一次需要调用MapperFactoryBean的getObje ...

  3. 简易的命令行聊天室程序(Winsock,服务器&客户端)

    代码中使用WinSock2函数库,设计并实现了简单的聊天室功能.该程序为命令行程序.对于服务器和客户端,需要: 服务器:创建监听套接字,并按本地主机绑定:主线程监听并接受来自客户端的请求,并为该客户端 ...

  4. Solr 清空数据的简便方法

    1. 首先访问你的 core,然后点击左侧的 Documents 2. 在 documents type 选择 XML 3. documents 输入下面语句 <delete><qu ...

  5. 使用 Solr 创建 Core 并导入数据库数据

    1. 输入 http://localhost:8080/solr/index.html 来到 Solr 的管理界面: 2. 点击左侧 Core Admin --> Add Core,然后输入自己 ...

  6. JVM学习记录-类加载器

    前言 JVM设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外面去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代码模块称为“类 ...

  7. Spark2.1.0模型设计与基本架构(下)

    阅读提示:读者如果对Spark的背景知识不是很了解的话,建议首先阅读<SPARK2.1.0模型设计与基本架构(上)>一文. Spark模型设计 1. Spark编程模型 正如Hadoop在 ...

  8. linux 安装 nvm

    curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash 或者 wget -qO- htt ...

  9. 百度前端学院task33源码及总结——听指令的小方块

    任务描述 如图,实现一个类似棋盘的格子空间,每个格子用两个数字可以定位,一个红正方形的DOM在这个空间内,正方形中的蓝色边表示这是他的正面,有一个input输入框 在输入框中允许输入如下指令,按下按钮 ...

  10. 测试本地node包

    @subject: 测试本地node包 @author: leinov @date: 2018-10-25 当我们编写一个node包,在发布到npm上之前,需要在本地测试该包.假设我们有一个已经编写好 ...