Spark SQL 介绍 付士涛. Spark SQL 介绍 付士涛 大纲 Architecture(架构) 像Hive一样的User Interface(用户操作界面) DataFrame的使用(1.3以前叫做SchemaRDD)

Slides:



Advertisements
Similar presentations
Exercise 1 EECS, Peking University Exercise in Query Processing.
Advertisements

第二章 简单的 SQL 语句. 本章要点  创建一个简单的表  SQL 语句介绍  最简单的查询语句 select  带有限制条件的查询  查询结果的排序显示.
第6章 数据库管理软件Access 年秋.
顧客交易紀錄分析實務 概述 26.2 資料分析的過程 26.3 顧客交易紀錄分析說明 26.4 實作一、顧客活動剖析實務演練
關聯查詢.
SQL的简单查询.
第2章 SQL语言初步 2.1 SQL的基本概念 2.2 基本表、索引的创建、删除和修改操作 2.3 SQL的查询语句——SELECT
第八讲 基于Hadoop的数据仓库Hive (PPT版本号:2016年4月6日版本)
第2讲 Transact-SQL语言.
数据库技术 实践.
第2章 数据模型 2.1 实体联系模型 2.2 关系模型 2.3 面向对象的数据模型 习 题 2.
商业分析平台-语义模型 用友集团技术中心 边传猛 2013年 11月 06日.
第8章 SELECT敘述的基本查詢 8-1 SELECT查詢指令 8-2 SELECT子句 8-3 FROM子句 8-4 WHERE子句
OceanBase 0.4:从API到SQL 日照
數位芝麻網路公司( 軟體工程師
巨量資料平台: Hadoop的生態系.
第6章 数据展示和输出功能 创建和使用报表 报表(Report)是以打印格式展示数据的一种有效方式。在报表中,可以展示图形、文字标题、字段数据或汇总数据等形式的信息,并可以控制各种数据的大小和外观。 利用报表,还可以按照数据之间的逻辑关系和所需的方式来组织数据之间的排版布局,对数据进行多级汇总和统计,或以图形方式展示数据。
为教师开展大数据课程教学提供全方位、一站式服务
Google App Engine Google 應用服務引擎.
Made by Feng Nie 开源机器学习库&Hadoop介绍 Made by Feng Nie
Python金融数据分析教程 解放你的python编程能力 第4关 如何获取金融数据 Python金融数据分析教程 1.
JAVA 程式設計與資料結構 第十一章 JDBC.
關聯式資料庫.
第十五章 常見的資料庫管理系統 目的 Oracle 微軟SQL Server 微軟Access MySQL Oracle 應用伺服器
Spark SQL 介绍 付士涛. Spark SQL 介绍 付士涛 大纲 Architecture(架构) 像Hive一样的User Interface(用户操作界面) DataFrame的使用(1.3以前叫做SchemaRDD)
9 SELECT敘述的進階查詢 9-1 SQL的多資料表查詢 9-2 合併查詢 9-3 集合運算查詢 9-4 子查詢
課程名稱:資料庫系統 授課老師:李春雄 博士
第二章 C# 基础知识.
Orca: A Modular Query Optimizer Architecture for Big Data Orca: 一个处理大数据的模块化的查询优化体系 Sigmod 2014 报告人 万丽蓉.
基于Hadoop的数据仓库Hive.
資料庫安全 (Database Security)
彰化縣政府補助辦理網頁設計資料庫應用班 ASP與資料庫介紹 建國技術學院資管系 饒瑞佶.
Spark在智慧图书馆建设中的应用探索 2017年12月22日.
SQL Server 2000 数据库入门.
第4章(2) 空间数据库 —关系数据库 北京建筑工程学院 王文宇.
巨量資料分析與應用 (1) 楊立偉教授 台大工管系暨商研所 2014 Fall.
实验 2:MS Access QBE Query使用
第5章 資料倉儲的資料建置.
从TDW-Hive到TDW-SparkSQL
第九章 進階的查詢技巧.
Spring & mongodb java实战mongodb 曹巍 2013年9月22日.
Spark Structured Streaming 流式大数据处理
《Spark编程基础》 《 Spark编程基础》课程介绍 (PPT版本号:2018年2月)
MySQL 結構化查詢語言 MySQL.
iRepor报表设计基础 IReport安装 普通实体报表 数据结果集报表 工作流主从报表 饼状图报表 柱状图,曲线图报表 条形码报表
第4章(1) 空间数据库 —数据库理论基础 北京建筑工程学院 王文宇.
SQL Injection (資料隱碼) 學生:a 吳倩瑜 指導教授:梁明章.
农村居民的信息需求与获取渠道研究 ——以云南省腾冲县为个案
資料庫管理 Homework #4 楊立偉教授 台灣大學工管系 2016.
講師:戴志華 國立台灣大學電機工程研究所 Visual Basic 程式設計 講師:戴志華 國立台灣大學電機工程研究所.
第11章 ListView延迟加载效果 授课老师:高成珍 QQ号: QQ群: 、
Answering aggregation question over knowledge base
第18章 SQL結構化查詢語言 18-1 SQL語言的基礎 18-2 SQL的查詢指令 18-3 SQL子查詢與合併查詢.
中国科学技术大学计算机系 陈香兰 2013Fall 第七讲 存储器管理 中国科学技术大学计算机系 陈香兰 2013Fall.
SAP Query 建立User Group (SQ03) 建立Infoset (SQ02)
查询与视图 蔡海洋.
從 ER 到 Logical Schema ──兼談Schema Integration
OceanBase 0.4:从API到SQL 日照
本讲内容 SQL 概述 SQL 的查询功能 SQL 的操作功能 SQL 的定义功能.
OrientX3.0及其改进之处 XML小组.
資料庫管理 Database Managent Ex.1-2 課本範例練習
8 SELECT敘述的基本查詢 8-1 SELECT查詢指令 8-2 SELECT子句 8-3 FROM子句 8-4 WHERE子句
11 檢視表的建立 11-1 檢視表的基礎 11-2 建立檢視表 11-3 修改與刪除檢視表 11-4 編輯檢視表的內容.
MySQL执行计划解读 胡中泉.
Report Programming Selection Screens 報表之Output格式設定 Detail list
C#快速導讀 流程控制.
第4章 数据查询.
第8章 Spark MLlib (PPT版本号: 2019年春季学期)
Web安全基础教程
高擴充高穩定高安全 企業級資料管理平台 Report Builder概論 錢曉明 資策會 資深講師 台灣微軟 資深講師.
Presentation transcript:

Spark SQL 介绍 付士涛

大纲 Architecture(架构) 像Hive一样的User Interface(用户操作界面) DataFrame的使用(1.3以前叫做SchemaRDD)

Architecture 优化 传统的SQL SparkSQL Parsing Analysis Binding & Analyzing Sql Text DataFrame Hive AST Parsing Unresolved Logical Plan Unresolved Logical Plan 传统的SQL SparkSQL Analysis Binding & Analyzing Metadata Resolved Logical Plan Logical Plan 优化 Optimize Optimizing Optimized Logical Plan Optimized Logical Plan Query Planning Query Planning Physical Plans Physical Plan Execution 2/24/2019 RDD&Execution

SparkSQL和Hive-On-Spark对比 功能上 实现上 覆盖了大部分的HiveQL特征 /HiveServer / CLI 提供了Spark的引擎特征(如缓存表) 提供给开发者的API(DataFrame) 为高级用户提供可插拔的组件(分析器/优化器等) 借用了HIVE上词汇分析的jars 借用了Hive Metastore和数据访问的API 重写了自己的分析器、执行器、优化器,脱离了hive的大部分依赖,提高了执行的效率 2/24/2019

开启SparkSQL Thrift Service /CLI Start the ThriftService $SPARK_HOME/sbin/start-thriftserver.sh Start the CLI $SPARK_HOME/bin/spark-sql 注:几乎在不改动HIVE任何配置的情况下重用HIVE的代码 2/24/2019

SparkSQL的三个核心部分 1. 可以加载各种结构化数据源(e.g., JSON, Hive, and Parquet). 2. 可以让你通过SQL ,Spark 内部程序或者外部工具,通过标准的数据库连接(JDBC/ODBC)连接Spark,比如一个商业智能的工具Tableau 3.SparkSQL 提供丰富又智能的SQL或者 regular Python/Java/Scala code,包括 join RDDS ,SQL tables ,使用SQL自定义用户函数UDF 2/24/2019

结构化数据的统一接口 2/24/2019

DataFrame 容易使用的API 支持Pydata Pandas 内置很多常用的功能和数据源 多种开发语言的支持(Scala/Java/Python/R/SQL) 感觉不到是运行在分布式集群之上的 只有在真正去执行的时候才会真实进行操作(lazy) 对逻辑计划和表达式进行了优化 可以和hive共享同一个metastore 和spark进行了无缝的集成 可扩展性 2/24/2019

DataFrame & Column Column(表达式) DataFrame(操作) 聚合函数 基本操作 printSchema / schema / explain / dtypes / cache/ persist etc. Actions head / first / take / count / collect etc. 像RDD一样的操作 map / flatMap / mapPartitions / foreach etc 集成性语言查询(SQL) filter / join / union / select / orderBy / groupBy / cube / rollup / sample / randomSplit etc. Column(表达式) 聚合函数 sum/avg/max/min … 一般函数操作(UDF) and / or / not / rand / lower / upper ... 数学函数 + / - / * /cos/sin/asin .. 统计函数 pearsonCorrelation / crossTabulate / calculateCov … 2/24/2019

开始:DataFrames SparkSQL切入点 Spark SQL 中所有相关功能的入口点是 SQLContext 类或者它的子类, 创建一个 SQLContext 需要一个 SparkContext。(在此以scala代码为例) 使用 Scala 创建方式如下: val sc: SparkContext // An existing SparkContext. val sqlContext = new org.apache.spark.sql.SQLContext(sc) // this is used to implicitly convert an RDD to a DataFrame. import sqlContext.implicits._ 注:HiveContext继承了SQLContext,使用它即可对hive进行操作,可以直接从hive表读取数据,而且提供了UDF的功能。 2/24/2019

创建DataFrame的形式 使用 SQLContext,应用可以从一个存在的 RDD、Hive 表或者数据源中创建 DataFrame。 val sc: SparkContext // An existing SparkContext. val sqlContext = new org.apache.spark.sql.SQLContext(sc) val df = sqlContext.read.json("file:///home/data/people.json") // Displays the content of the DataFrame to stdout df.show() 2/24/2019

DataFrame操作 DataFrame提供了一种DSL语言,例如scala,java以及python //引用上页的代码 // Print the schema in a tree format df.printSchema() // root // |-- age: long (nullable = true) // |-- name: string (nullable = true) // Select everybody, but increment the age by 1 df.select(df("name"), df("age") + 1).show() // name (age + 1) // Andy 31 // Justin 20 // Select people older than 21 df.filter(df("age") > 21).show() // age name // 30 Andy 2/24/2019

RDD转化为DataFrame 利用反射推断模式 Spark SQL的 Scala 接口支持将包含样本类的 RDD 自动转换为 DataFrame。这个样本类定义了表的模式。样本类的参数名字通过反射来读取,然后作为列的名字。样本类可以嵌套或者包含复杂的类型如序列或者数组。这个 RDD 可以隐式转化为一个 DataFrame,然后注册为一个表,表可以在后续的 sql 语句中使用。 编程指定模式 当样本类不能提前确定(例如,记录的结构是经过编码的字符串,或者一个文本集合将会被解析,不同的字段投影给不同的用户),一个 DataFrame 可以通过三步来创建。 从原来的 RDD 创建一个行的 RDD 创建由一个 StructType 表示的模式与第一步创建的 RDD 的行结构相匹配 在行 RDD 上通过 createDataFrame 方法应用模式 2/24/2019

反射推断模式 val sqlContext = new org.apache.spark.sql.SQLContext(sc) import sqlContext.implicits._ case class Person(name: String, age: Int) val people = sc.textFile("file:///resources/people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF() people.registerTempTable("people") val teenagers = sqlContext.sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19") teenagers.map(t => "Name: " + t(0)).collect().foreach(println) 2/24/2019

编程指定模式 从原来的 RDD 创建一个行的 RDD val sqlContext = new org.apache.spark.sql.SQLContext(sc) val people = sc.textFile("file:///resources/people.txt") import org.apache.spark.sql.Row; val rowRDD = people.map(_.split(",")).map(p => Row(p(0), p(1).trim)) 创建由一个 StructType 表示的模式与第一步创建的 RDD 的行结构相匹配 val schemaString = "name age" import org.apache.spark.sql.types.{StructType,StructField,StringType}; val schema =StructType( schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true))) 在行 RDD 上通过 createDataFrame 方法应用模式 val peopleDataFrame = sqlContext.createDataFrame(rowRDD, schema) peopleDataFrame.registerTempTable("people") val results = sqlContext.sql("SELECT name FROM people") results.map(t => "Name: " + t(0)).collect().foreach(println) 2/24/2019

Data Source APIs // Scala val df1 = Seq(("Justin", 31, 1), ("Hao", 33, 2)). toDF("name","age", "deptId") df1.write.mode( SaveMode.Overwrite).parquet("/data/people.parquet") 2/24/2019

用Hive集成 // Scala SparkContext sc = new SparkContext(new SparkConf() . setMaster("local"). setAppName("test")); HiveContext hc = new HiveContext(sc); val hc = new org.apache.spark.sql.HiveContext(sc) val employee = hc.json("/user/data/employee") val dept = hc.json("/user/data/department") val result = employee.filter("age > 30") .join(dept, employee("deptId") === dept("id")) . groupBy(dept("name"), "gender") result.orderBy("age").select("gender").head(4) 2/24/2019

// Assume we have a Hive Table Name "salary" employee.registerTempTable("employee") val result: DataFrame = hc.sql("SELECT avg(s.amount), e.deptId FROM employee e JOIN salary s ON e.id=s.id GROUP BY e.deptId") result.write(). saveAsTable("myresult") // Do query against table "myresult" in Hive 2/24/2019

自定义UDF // Register the function in Scala sqlContext.udf.register("myUdf", (arg1: Int, arg2: String) => arg2 + arg1) // Query in SQL using the function sqlContext.sql("SELECT myUDF(age, name) from people") 2/24/2019

内存中的列式缓存表 Spark Caching DataFrame Columnar Caching 2/24/2019

内存中的列式缓存表(续) 更少的分配对象(更少的内存,更少的GC) 扫描/反序列化所需的列 更好的压缩 开发人员code形式: df.cache() / df.persist(StorageLevel) / df.unpersist() 对于CLI/ThriftService用户 "CACHE [LAZY]TABLE result AS SELECT * FROM employee WHERE joinDate>’2010-07-01’;" "UNCACHE TABLE result;" 2/24/2019

SQL自动的优化执行计划 SparkSQL优化逻辑计划和表达式树 // Scala val t1 = hc.table("a") val t2 = hc.table("b") val result1 = t1.join(t2, (t1("key")===t2("key")) && (t1("key") < 10)).select(t1("value"), t2("value")) SELECT a.age, b. FROM aINNER JOIN b ON a.key=b.key AND a.key<10 result1.explain(true) // print logical plan (before / after optimization) 2/24/2019

谢谢 2/24/2019