Spark SQL - 对大规模的结构化数据进行批处理和流式处理
Spark SQL - 对大规模的结构化数据进行批处理和流式处理
大体翻译自:https://jaceklaskowski.gitbooks.io/mastering-apache-spark/content/spark-sql.html
如同一般的 Spark 处理,Spark SQL 本质上也是大规模的基于内存的分布式计算。
Spark SQL 和 RDD 计算模型最大的区别在于数据处理的框架不同。Spark SQL 可以通过多种不同的方式对结构化的数据和半结构化的数据进行处理。它既可以使用 SQL , HiveQL 这种结构化查询查询语言,也可以使用类 SQL,声明式,类型安全的Dataset API 进行查询,这种被称为 Structured Query DSL。
Note:可以通过 Schema 对结构化和半结构化的数据进行描述。
Spark SQL 支持 批处理(Batch) 和流式处理(Struct streaming) 两种处理方式。
Note:本质上,结构化查询都会自动编译为相应的 RDD 操作。
无论使用什么样的查询方式,所有的查询都会转化为一个由 Catalyst expressions 组成的树,在这个过程中会对不断的对查询进行优化。
在 Spark 2.0 以后, Spark SQL 已经成为了 Spark 计算平台最主要的接口, 它通过更高层次的抽象封装了RDD,方便用户通过 SQL 处理数据。
// Define the schema using a case class
case class Person(name: String, age: Int)
// you could read people from a CSV file
// It's been a while since you saw RDDs, hasn't it?
// Excuse me for bringing you the old past.
import org.apache.spark.rdd.RDD
val peopleRDD: RDD[Person] = sc.parallelize(Seq(Person("Jacek", 10)))
// Convert RDD[Person] to Dataset[Person] and run a query
// Automatic schema inferrence from existing RDDs
scala> val people = peopleRDD.toDS
people: org.apache.spark.sql.Dataset[Person] = [name: string, age: int]
// Query for teenagers using Scala Query DSL
scala> val teenagers = people.where('age >= 10).where('age <= 19).select('name).as[String]
teenagers: org.apache.spark.sql.Dataset[String] = [name: string]
scala> teenagers.show
+-----+
| name|
+-----+
|Jacek|
+-----+
// You could however want to use good ol' SQL, couldn't you?
// 1. Register people Dataset as a temporary view in Catalog
people.createOrReplaceTempView("people")
// 2. Run SQL query
val teenagers = sql("SELECT * FROM people WHERE age >= 10 AND age <= 19")
scala> teenagers.show
+-----+---+
| name|age|
+-----+---+
|Jacek| 10|
+-----+---+
通过启动 Hive 支持 (enableHiveSupport),用户可以 HiveQL 对 Hive 中的数据进行处理。
sql("CREATE OR REPLACE TEMPORARY VIEW v1 (key INT, value STRING) USING csv OPTIONS ('path'='people.csv', 'header'='true')")
// Queries are expressed in HiveQL
sql("FROM v1").show
scala> sql("desc EXTENDED v1").show(false)
+----------+---------+-------+
|col_name |data_type|comment|
+----------+---------+-------+
|# col_name|data_type|comment|
|key |int |null |
|value |string |null |
+----------+---------+-------+
和其它的数据库一样, Spark SQL 通过 Logical Query Plan Optimizer, code generation , Tungsten execution engine 来这些措施进行优化。
Spark SQL 引入了一种抽象的表格式的数据结构 Dataset。 通过 Dataset, Spark SQL 可以更加方便、快速的处理大批量的结构化数据。
Note:Spark SQL 借助Apache Drill 直接在一些数据文件上进行查询
下面的片段展示了如何读取JSON文件,然后将一种一部分数据保存为CSV文件。
spark.read
.format("json")
.load("input-json")
.select("name", "score")
.where($"score" > 15)
.write
.format("csv")
.save("output-csv")
DataSet 是 Spark SQL 中最核心的抽象。他表示了一批已知 schema 的结构化数据。这些数据可以可以保存在JVM 堆外的内存中,并且变为列压缩的二进制串,来增加计算的速度,减少内存的使用和GC。
Spark SQL 支持 predicate pushdown 对 DataSet 的性能进行优化,并且可以在运行时生成优化代码。
Spark SQL 包含了以下几种 API:
- Dataset API
- Structred Streaming API
- SQL
- JDBC/ODBC
Spark SQL 通过 DataFrameReader 和 DataFrameWrite 这两个统一的接口来访问 HDFS 等存储系统。
Spark SQL 定义了集中不同类型的函数:
- 标准函数 和 UDF。
- 基本的集合函数。
- 窗口聚合函数。
如果你已经将一个 CSV 加载到一个 dataframe 中了,那你可以通过将 dataframe 注册为 table, 然后使用 SQL 进行查询。
// Example 1
val df = Seq(1 -> 2).toDF("i", "j")
val query = df.groupBy('i)
.agg(max('j).as("aggOrdering"))
.orderBy(sum('j))
.as[(Int, Int)]
query.collect contains (1, 2) // true
// Example 2
val df = Seq((1, 1), (-1, 1)).toDF("key", "value")
df.createOrReplaceTempView("src")
scala> sql("SELECT IF(a > 0, a, 0) FROM (SELECT key a FROM src) temp").show
+-------------------+
|(IF((a > 0), a, 0))|
+-------------------+
| 1|
| 0|
+-------------------+
更多参考:
Spark SQL - 对大规模的结构化数据进行批处理和流式处理的更多相关文章
- Spark如何与深度学习框架协作,处理非结构化数据
随着大数据和AI业务的不断融合,大数据分析和处理过程中,通过深度学习技术对非结构化数据(如图片.音频.文本)进行大数据处理的业务场景越来越多.本文会介绍Spark如何与深度学习框架进行协同工作,在大数 ...
- Spark读取结构化数据
读取结构化数据 Spark可以从本地CSV,HDFS以及Hive读取结构化数据,直接解析为DataFrame,进行后续分析. 读取本地CSV 需要指定一些选项,比如留header,比如指定delimi ...
- Salesforce开源TransmogrifAI:用于结构化数据的端到端AutoML库
AutoML 即通过自动化的机器学习实现人工智能模型的快速构建,它可以简化机器学习流程,方便更多人利用人工智能技术.近日,软件行业巨头 Salesforce 开源了其 AutoML 库 Transmo ...
- Bigtable:结构化数据的分布式存储系统
Bigtable最初是谷歌设计用来存储大规模结构化数据的分布式系统,其可以在数以千计的商用服务器上存储高达PB级别的数据量.开源社区根据Bigtable的设计思路开发了HBase.其优势在于提供了高效 ...
- MySQL 5.7:非结构化数据存储的新选择
本文转载自:http://www.innomysql.net/article/23959.html (只作转载, 不代表本站和博主同意文中观点或证实文中信息) 工作10余年,没有一个版本能像MySQL ...
- Solr系列四:Solr(solrj 、索引API 、 结构化数据导入)
一.SolrJ介绍 1. SolrJ是什么? Solr提供的用于JAVA应用中访问solr服务API的客户端jar.在我们的应用中引入solrj: <dependency> <gro ...
- Bigtable:一个分布式的结构化数据存储系统
Bigtable:一个分布式的结构化数据存储系统 摘要 Bigtable是一个管理结构化数据的分布式存储系统,它被设计用来处理海量数据:分布在数千台通用服务器上的PB级的数据.Google的很多项目将 ...
- (四)DIH导入结构化数据
(四)DIH导入结构化数据 目前大多数的应用程序将数据存储在关系数据库(如oracle.sql server .mysql等).xml文件中.对这样的数据进行搜索是很常见的应用.所谓的DataImpo ...
- WordPress插件--WP BaiDu Submit结构化数据插件又快又全的向百度提交网页
一.WP BaiDu Submit 简介 WP BaiDu Submit帮助具有百度站长平台链接提交权限的用户自动提交最新文章,以保证新链接可以及时被百度收录. 安装WP BaiDu Submit后, ...
随机推荐
- [jzoj 6080] [GDOI2019模拟2019.3.23] IOer 解题报告 (数学构造)
题目链接: https://jzoj.net/senior/#main/show/6080 题目: 题意: 给定$n,m,u,v$ 设$t_i=ui+v$ 求$\sum_{k_1+k_2+...+k_ ...
- Kafka.net使用编程入门
最近研究分布式消息队列,分享下! 首先zookeeper 和 kafka 压缩包 解压 并配置好! 我本机zookeeper环境配置如下: D:\Worksoftware\ApacheZookeep ...
- Hibernate框架学习(六)——一对多&多对一关系
一.关系表达 1.表中的表达 2.实体中的表达 3.orm元数据中的表达 一对多:(在Customer.hbm.xml中添加) 多对一:(在LinkMan.hbm.xml中添加) 最后别忘了在hibe ...
- where条件顺序与建索引顺序
查询时,如果数据量很大,where 后面的条件与建索引的顺序相同,也没有什么多少差别,聚集索引稍微快点; 但where 后面的条件与建索引顺序不同,速度会慢下来,到底慢多少,不同的机器会不一样,没有绝 ...
- Win10 UI入门 导航滑动条 求UWP工作
借鉴了 段博琼 大哥写的导航滑动,自己实现了一个类似安卓 IOS 导航滑动条 支持等比例 分割 tabView 支持动画滑动 效果如下图 WYGrid 你可以想象一个GridView itemsWr ...
- 从url获取参数有中文时会出现乱码的问题
http://192.168.1.133/v2?groupId=58&opFlag=1&result=C,B,B,B,D&Name=本人很帅 我们js获取的url中的Name其 ...
- (4)pyspark---dataframe清理
1.交叉表(crosstab): pandas中也有,常和pivot_table比较. 查看家庭ID与评分的交叉表: 2.处理缺失值:fillna withColumn:新增一列数据 cast : 用 ...
- 论wpf的设备无关性 - 简书
原文:论wpf的设备无关性 - 简书 WPF从发布之日起,一直将“分辨率无关(resolution independence)”作为其亮点,声称使用WPF制作的用户界面在轻巧的Ultra-Mobile ...
- 使用剩余参数代替 arguments (prefer-rest-params)
使用剩余参数代替 arguments (prefer-rest-params) 剩余参数来自于ES2016.可以在可变函数中使用这个特性来替代arguments变量. arguments没有Array ...
- SQL在线学习网站
1.在线编写网页:http://sqlfiddle.com/ 2.SQL菜鸟教程:http://www.runoob.com/sql/sql-intro.html 3.SQL语句在线练习 http:/ ...