Spark SQL之External DataSource外部数据源(一)示例

原创 2014年12月22日 01:12:20

一、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 jsonTable
USING org.apache.spark.sql.json
OPTIONS (
  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.SQLContext
import org.apache.spark.sql.SQLContext

scala> val sqlContext  = new SQLContext(sc)
sqlContext: org.apache.spark.sql.SQLContext = org.apache.spark.sql.SQLContext@7be62956

scala> 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'
     | |)""".stripMargin
jsonDDL: String = 
"
CREATE TEMPORARY TABLE jsonTable
USING org.apache.spark.sql.json
OPTIONS (
 path  'file:///Users/shengli/git_repos/spark/examples/src/main/resources/people.json'
)"

scala> sqlContext.sql(jsonDDL).collect() //创建该外部数据源表jsonTable
14/12/21 16:44:27 INFO scheduler.DAGScheduler: Job 0 finished: reduce at JsonRDD.scala:57, took 0.204461 s
res0: 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").queryExecution
res6: 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:47

Code 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:39
res2: 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连接外部数据源解读

本文以连接HBase数据库为例,介绍Spark DataSource API的结构。项目源码:https://github.com/hortonworks-spark/shc 注:由于某些原因,尚无充...
  • bluishglc
  • bluishglc
  • 2016年10月21日 12:51
  • 4774

SparkSQL入门_1

sparksql
  • Young_Gy
  • Young_Gy
  • 2015年10月30日 17:18
  • 921

Spark SQL简单操作演示(含导出表)

Spark SQL前身是Shark,由于Shark对于Hive的太多依赖制约了Spark的发展,Spark SQL由此产生。 Spark SQL只要在编译的时候引入Hive支持,就可以支持Hive表访...
  • Dr_Guo
  • Dr_Guo
  • 2016年05月15日 22:10
  • 11115

SparkSQL相关语句总结

1.in 不支持子查询 eg. select * from src where key in(select key from test); 支持查询个数 eg. select * from src ...
  • fly_time2012
  • fly_time2012
  • 2016年05月20日 17:36
  • 3018

Spark SQL 简单使用

环境:scala 版本2.11.8,spark 版本2.0.1,使用 Intellij IDEA 来开发。
  • M_SIGNALs
  • M_SIGNALs
  • 2016年11月28日 20:25
  • 2852

Spark SQL入门用法与原理分析

sparkSQL是为了让开发人员摆脱自己编写RDD等原生Spark代码而产生的,开发人员只需要写一句SQL语句或者调用API,就能生成(翻译成)对应的SparkJob代码并去执行,开发变得更简洁注意:...
  • qq_33813365
  • qq_33813365
  • 2017年04月23日 17:09
  • 628

Spark-SparkSQL深入学习系列十一(转自OopsOutOfMemory)

上周Spark1.2刚发布,周末在家没事,把这个特性给了解一下,顺便分析下源码,看一看这个特性是如何设计及实现的。     /** Spark SQL源码分析系列文章*/   (Ps: E...
  • youdianjinjin
  • youdianjinjin
  • 2016年05月11日 19:38
  • 560

Spark SQL之External DataSource外部数据源

http://blog.csdn.net/oopsoom/article/details/42061077一、Spark SQL External DataSource简介  随着Spark1.2的发...
  • bluejoe2000
  • bluejoe2000
  • 2015年10月02日 11:53
  • 3141

Spark 2.1 -- spark SQL , Dataframe 和DataSet 指南

Overview SQLDatasets and DataFrames Getting Started Starting Point: SparkSessionCreating Data...
  • hopeatme
  • hopeatme
  • 2017年03月29日 23:56
  • 3577

Spark与HBase的整合

前言 之前因为仅仅是把HBase当成一个可横向扩展并且具有持久化能力的KV数据库,所以只用在了指标存储上,参看很早之前的一篇文章基于HBase做Storm 实时计算指标存储。这次将HBase用在...
  • u014589856
  • u014589856
  • 2017年07月28日 14:08
  • 513
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spark SQL之External DataSource外部数据源(一)示例
举报原因:
原因补充:

(最多只允许输入30个字)