Spark SQL之External DataSource外部数据源(一)示例
来源:互联网 发布:淘宝电商是什么 编辑:程序博客网 时间:2024/05/18 20:51
一、Spark SQL External DataSource简介
随着Spark1.2的发布,Spark SQL开始正式支持外部数据源。Spark SQL开放了一系列接入外部数据源的接口,来让开发者可以实现。
这使得Spark SQL支持了更多的类型数据源,如json, parquet, avro, csv格式。只要我们愿意,我们可以开发出任意的外部数据源来连接到Spark SQL。之前大家说的支持HBASE,Cassandra都可以用外部数据源的方式来实现无缝集成。
(Ps: 关于External Datasource源码解析篇请移步至:Spark SQL之External DataSource外部数据源(二)源码分析 http://blog.csdn.net/oopsoom/article/details/42064075)
二、External DataSource
拿Spark1.2的json为例,它支持已经改为了实现了外部数据源的接口方式。所以除了先前我们操作json的API,又多了一种DDL创建外部数据源的方式。
parquetFile的操作方式也如下类似,就不一一列举了。
2.1 SQL方式 CREATE TEMPORARY TABLE USING OPTIONS
在Spark1.2之后,支持了一种CREATE TEMPORARY TABLE USING OPTIONS的DDL语法来创建外部数据源的表。
CREATE TEMPORARY TABLE jsonTableUSING org.apache.spark.sql.jsonOPTIONS ( path '/path/to/data.json')
1、操作示例:
我们拿example下people.json文件来做示例。
shengli-mac$ cat /Users/shengli/git_repos/spark/examples/src/main/resources/people.json{"name":"Michael"}{"name":"Andy", "age":30}{"name":"Justin", "age":19}2、DDL创建外部数据源表jsonTable:
14/12/21 16:32:14 INFO repl.SparkILoop: Created spark context..Spark context available as sc.scala> import org.apache.spark.sql.SQLContextimport org.apache.spark.sql.SQLContextscala> val sqlContext = new SQLContext(sc)sqlContext: org.apache.spark.sql.SQLContext = org.apache.spark.sql.SQLContext@7be62956scala> import sqlContext._import sqlContext._//创建jsonTable外部数据源表,并且指定其数数据源文件是people.json这个json文件,同时指定使用org.apache.spark.sql.json该类型的隐式转化类(这个后续文章会介绍)scala> val jsonDDL = s""" | |CREATE TEMPORARY TABLE jsonTable | |USING org.apache.spark.sql.json | |OPTIONS ( | | path 'file:///Users/shengli/git_repos/spark/examples/src/main/resources/people.json' | |)""".stripMarginjsonDDL: String = "CREATE TEMPORARY TABLE jsonTableUSING org.apache.spark.sql.jsonOPTIONS ( path 'file:///Users/shengli/git_repos/spark/examples/src/main/resources/people.json')"scala> sqlContext.sql(jsonDDL).collect() //创建该外部数据源表jsonTable14/12/21 16:44:27 INFO scheduler.DAGScheduler: Job 0 finished: reduce at JsonRDD.scala:57, took 0.204461 sres0: Array[org.apache.spark.sql.Row] = Array()
我们来看下该schemaRDD:
scala> val jsonSchema = sqlContext.sql(jsonDDL)jsonSchema: org.apache.spark.sql.SchemaRDD = SchemaRDD[7] at RDD at SchemaRDD.scala:108== Query Plan ==== Physical Plan ==ExecutedCommand (CreateTableUsing jsonTable, org.apache.spark.sql.json, Map(path -> file:///Users/shengli/git_repos/spark/examples/src/main/resources/people.json))
ExecutedCommand来取把数据用spark.sql.json的方式从path加载到jsonTable中。涉及到得类是CreateTableUsing,后续源码分析会讲到。
各阶段执行计划情况:
scala> sqlContext.sql("select * from jsonTable").queryExecutionres6: org.apache.spark.sql.SQLContext#QueryExecution = == Parsed Logical Plan =='Project [*] 'UnresolvedRelation None, jsonTable, None== Analyzed Logical Plan ==Project [age#0,name#1] Relation[age#0,name#1] JSONRelation(file:///Users/shengli/git_repos/spark/examples/src/main/resources/people.json,1.0)== Optimized Logical Plan ==Relation[age#0,name#1] JSONRelation(file:///Users/shengli/git_repos/spark/examples/src/main/resources/people.json,1.0)== Physical Plan ==PhysicalRDD [age#0,name#1], MapPartitionsRDD[27] at map at JsonRDD.scala:47Code Generation: false== RDD ==
至此,创建加载外部数据源到Spark SQL已经完成。
3、SQL查询方式:
scala> sqlContext.sql("select * from jsonTable")21 16:52:13 INFO spark.SparkContext: Created broadcast 6 from textFile at JSONRelation.scala:39res2: org.apache.spark.sql.SchemaRDD = SchemaRDD[20] at RDD at SchemaRDD.scala:108== Query Plan ==== Physical Plan ==PhysicalRDD [age#2,name#3], MapPartitionsRDD[24] at map at JsonRDD.scala:47
执行查询:
scala> sqlContext.sql("select * from jsonTable").collect()res1: Array[org.apache.spark.sql.Row] = Array([null,Michael], [30,Andy], [19,Justin])
2.2 API方式
sqlContext.jsonFile
scala> val json = sqlContext.jsonFile("file:///Users/shengli/git_repos/spark/examples/src/main/resources/people.json")scala> json.registerTempTable("jsonFile")scala> sql("select * from jsonFile").collect()res2: Array[org.apache.spark.sql.Row] = Array([null,Michael], [30,Andy], [19,Justin])
三、总结
总的来说,Spark SQL 在努力的向各种数据源靠拢,希望让Spark SQL能和其它许多类型的数据源的集成。
Spark SQL提供的了一种创建加载外部数据源表的DDL语法:CREATE TEMPORARY TABLE USING OPTIONS
Spark SQL对外开放了一系列的扩展接口,能够通过实现这些接口,来实现对不同的数据源接入,如avro, csv, parquet,json, etc......
——THE END——
原创文章,转载请注明出自:http://blog.csdn.net/oopsoom/article/details/42061077
- Spark SQL之External DataSource外部数据源(一)示例
- Spark SQL之External DataSource外部数据源
- Spark SQL之External DataSource外部数据源(二)源码分析
- spark SQL学习(数据源之json)
- powerbuild 外部数据源(external)的datawindow赋值
- Spark中External Datasource实现数据迁移
- Spark外部数据源demo
- MyBatis-dataSource(数据源)
- 数据源(dataSource)
- Spark连接外部数据源解读
- spark-shell读取外部数据源
- Spark--Datasource(Hive)
- bboss-persistent持久层框架通过jndi引用外部数据源(datasource)
- 基于Hbase的Spark Sql示例 一
- MyBatis源代码--数据源(dataSource)
- datasource数据源
- 5.Spark SQL:Parquet数据源之自动分区推断
- 6.Spark SQL:Parquet数据源之合并元数据
- leetcode:Single Number 菜鸟解法
- 判断是否是手机号码
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之20-Cocoa和Cocoa Touch简介——黑马 IOS 技术博客
- Android程序开发重新开始一
- 安装office2007安装程序找不到office.zh-cn\*三种详细解决方案
- Spark SQL之External DataSource外部数据源(一)示例
- 炸弹
- Combination Sum求和为给定值的所有序列的解题思路
- 分布式系统阅读笔记(三)-----计算机网络和网络互连技术
- 离散时间序列的内插算法(sinc 函数内插)
- 【第二次作业】
- MTK 软件设置路径
- 第十七周项目2-引用做形参(2)
- Emacs常用命令快速参考