1. SparkSession
sparkSession可以视为sqlContext和hiveContext以及StreamingContext的结合体,这些Context的API都可以通过sparkSession使用。
创建SparkSession
 
val spark = SparkSession.builder
    .master("local[2]")
    .appName("spark session example")
    .getOrCreate()1234
使用enableHiveSupport就能够支持hive,相当于hiveContext
 
val spark = SparkSession.builder
    .master("local[2]")
    .appName("spark session example")
    .enableHiveSupport()
    .getOrCreate()12345
API操作,与之前的Context基本一致
 
//读取csv数据
val df0 = spark.read
  .option("header","true")
  .csv("src/main/resources/test.csv")
//读取parquet数据
val df1 = spark.read.parquet("...")
//读取json数据
val df2 = spark.read.json("...")
//sql查询
val df3 = spark.sql("xxx")
1234567891011121314
Spark 2.0向后兼容,所以hiveContext以及sqlContext依旧可用,不过官方建议开发者开始使用SparkSession。
 
2. DataSet,RDD,DataFrame
RDD
类型安全,面向对象编程风格,序列化以及反序列化开销大。
DataFrame
提供了查询优化器,分区剪枝,自动判断是否使用broadcast join等功能,对rdd进行了大量的优化。对spark了解不深的编程/分析人员非常友好。
可以视为Row类型的Dataset (Dataset[Row]),非类型安全,不是面向对象编程风格。
DataSet
继承了RDD和DataFrame的优点。数据以编码的二进制形式存储,将对象的schema映射为SparkSQL类型,不需要反序列化就可以进行shuffle等操作,每条记录存储的则是强类型值,类型安全,面向对象编程风格。
 
Dataset的创建
dataset可以从rdd,dataFrame转化,也可以从原始数据直接生成。
通过toDS方法创建
 
val ds1 = Seq("a","b").toDS()
ds1.show
//+-----+
//|value|
//+-----+
//|    a|
//|    b|
//+-----+123456789
通过createDataSet创建
 
case class Person(name: String, age: Int)
val data = Seq(Person("lsw", 23), Person("yyy", 22))
val ds2 = spark.createDataset(data)
ds2.show
//+----+---+
//|name|age|
//+----+---+
//| lsw| 23|
//| yyy| 22|
//+----+---+1234567891011
 
DataSet与RDD使用上的区别
Dataset 结合了 rdd 和 DataFrame 上大多数的API,所以spark 1.x基于 rdd 或 DataFrame 的代码可以很容易的改写成spark 2.x版本
数据读取
RDDs
sparkContext.textFile("/path/to/data.txt")1
Datasets
//返回 DataFrame
val df = spark.read.text("/path/to/data.txt")
//返回 DataSet[String]
val ds1 = spark.read.textFile("/path/to/data.txt")
//或者读取成DataFram再转化成Dataset
val ds2 = spark.read.text("/path/to/data.txt").as[String]123456
常用API
RDDs
//flatMap,filter
val lines = sc.textFile("/path/to/data.txt")
val res = lines
  .flatMap(_.split(" "))
  .filter(_ != "")
//reduce
val rdd = sc.makeRDD(Seq(1, 2, 3, 4))
rdd.reduce((a, b) => a + b)123456789
Datasets
//flatMap,filter
val lines = spark.read.textFile("/path/to/data.txt")
val res = lines
  .flatMap(_.split(" "))
  .filter(_ != "")
//reduce
val ds = Seq(1, 2, 3, 4).toDs
ds.reduce((a, b) => a + b)123456789
reduceByKey
RDDs
val reduceCountByRDD = wordsPair
  .reduceByKey(_+_)12
Datasets
val reduceCountByDs = wordsPairDs
  .mapGroups((key,values) =>(key,values.length))12
RDD,DataFrame,Dataset的相互转化
import spark.implicits._
//Dataset转化为RDD
val ds2rdd = ds.rdd
//Dataset转为DataFrame
val ds2df = ds.toDF
//RDD转化为Dataset
val rdd2ds = rdd.toDS
//RDD转化为DataFrame
val rdd2df = rdd.toDF
//DataFrame转化为RDD
val df2rdd = df.rdd
//DataFrame转化为DataSet
val df2ds = df.as[Type]
12345678910111213141516
wordCount
data.txt
hello world
hello spark12
RDDs
val rdd = sc.textFile("src/main/resources/data.txt")
val wordCount = rdd
  .map(word => (word,1))
  .reduceByKey(_+_)1234
Datasets
import spark.implicits._
val wordCount1 = lines
  .flatMap(r => r.split(" "))
  .groupByKey(r => r)
  .mapGroups((k, v) => (k, v.length))
wordCount1.show
//  +-----+--------+
//  |value|count(1)|
//  +-----+--------+
//  |hello|       2|
//  |spark|       1|
//  |world|       1|
//  +-----+--------+
//也可以直接使用count函数
val wordCount2 = lines
  .flatMap(r => r.split(" "))
  .groupByKey(v => v)
  .count()
wordCount2.show
//  +-----+---+
//  |   _1| _2|
//  +-----+---+
//  |hello|  2|
//  |spark|  1|
//  |world|  1|
//  +-----+---+123456789101112131415161718192021222324252627
Dataset性能提升(来自官方)
 
 
 
3. Catalog
Spark 2.0中添加了标准的API(称为catalog)来访问Spark SQL中的元数据。这个API既可以操作Spark SQL,也可以操作Hive元数据。
 
获取catalog
从SparkSession中获取catalog
 
val catalog = spark.catalog1
 
查询临时表和元数据中的表
返回Dataset[Table]
catalog.listTable.show
//  +----+--------+-----------+---------+-----------+
//  |name|database|description|tableType|isTemporary|
//  +----+--------+-----------+---------+-----------+
//  |table|   null|      null|TEMPORARY|        true|
//  |act | default|      null| EXTERNAL|       false|
//  +----+--------+-----------+---------+-----------+
1234567
 
创建临时表
使用createTempView和createOrReplaceTempView取代registerTempTable。
例如   
df.createTempView("table")
df.createOrReplaceTempView("table")
12
createTempView
创建临时表,如果已存在同名表则报错。
createOrReplaceTempView
创建临时表,如果存在则进行替换,与老版本的registerTempTable功能相同。
 
销毁临时表
使用dropTempView取代dropTempTable,销毁临时表的同事会清除缓存的数据。
spark.dropTempView("table")
1
 
缓存表
对数据进行缓存
//缓存表有两种方式
df.cache
catalog.cacheTable("table")
//判断数据是否缓存
catalog.isCached("table")
123456
catalog相较于之前的API,对metadata的操作更加的简单,直观。

将代码从 spark 1.x 移植到 spark 2.x的更多相关文章

  1. (一)Spark简介-Java&Python版Spark

    Spark简介 视频教程: 1.优酷 2.YouTube 简介: Spark是加州大学伯克利分校AMP实验室,开发的通用内存并行计算框架.Spark在2013年6月进入Apache成为孵化项目,8个月 ...

  2. Spark学习(四) -- Spark作业提交

    标签(空格分隔): Spark 作业提交 先回顾一下WordCount的过程: sc.textFile("README.rd").flatMap(line => line.s ...

  3. Spark入门实战系列--1.Spark及其生态圈简介

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .简介 1.1 Spark简介 年6月进入Apache成为孵化项目,8个月后成为Apache ...

  4. Spark入门实战系列--3.Spark编程模型(上)--编程模型及SparkShell实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark编程模型 1.1 术语定义 l应用程序(Application): 基于Spar ...

  5. Spark入门实战系列--4.Spark运行架构

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 1. Spark运行架构 1.1 术语定义 lApplication:Spark Appli ...

  6. Spark入门实战系列--7.Spark Streaming(上)--实时流计算Spark Streaming原理介绍

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Spark Streaming简介 1.1 概述 Spark Streaming 是Spa ...

  7. Spark入门实战系列--7.Spark Streaming(下)--实时流计算Spark Streaming实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .实例演示 1.1 流数据模拟器 1.1.1 流数据说明 在实例演示中模拟实际情况,需要源源 ...

  8. Spark入门实战系列--8.Spark MLlib(上)--机器学习及SparkMLlib简介

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .机器学习概念 1.1 机器学习的定义 在维基百科上对机器学习提出以下几种定义: l“机器学 ...

  9. Spark入门实战系列--8.Spark MLlib(下)--机器学习库SparkMLlib实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .MLlib实例 1.1 聚类实例 1.1.1 算法说明 聚类(Cluster analys ...

随机推荐

  1. hdu-1878(欧拉回路)

    题目链接:传送门 思路:就是判断无向图的欧拉回路的两个条件:(1)连通性(2)点的度数是偶数 注意:两个条件一同时满足才行. #include<iostream> #include< ...

  2. Java程序员职业生涯规划完整版:从程序员到CTO( 摘)

    在技巧方面无论我们怎么学习,总感觉需要晋升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样我们清楚的知道我们大概处于那个阶段和水平. Java程序员 高等特性 反射.泛型. ...

  3. RISC与CISC比较

    1.RISC与CISC的差异 处理器的指令集可简单分为2种,CISC(complex instruction set computer)以及RISC(reduced instruction set c ...

  4. h5移动网页唤起App

    最近这个困惑了很久,不断的有一些坑,目前还有疑问关于iOS唤起无效时会出现弹框的问题,这个最后再说 1.首先可能需要判断当前浏览器的来源(目前开发的App还没有上架,所以针对腾讯出品的大家广为人知的微 ...

  5. centos下安装nethogs

    wget https://github.com/raboof/nethogs/archive/v0.8.1.tar.gzyum install libpcap-develtar zxvf v0.8.1 ...

  6. NET Core微服务之路:再谈分布式系统中一致性问题分析

    前言 一致性:很多时候表现在IT系统中,通常在分布式系统中,必须(或最终)为多个节点的数据保持一致.世间万物,也有存在相同的特征或相似,比如儿时的双胞胎,一批工厂流水线的产品,当然,我们不去讨论非IT ...

  7. ReactNative学习笔记(五)踩坑总结

    已经发现的bug或者问题 Android不支持shadow属性: Animated.Image的borderRadius不生效: setNativeProps无法修改图片的source: 没有直接设置 ...

  8. [UWP]使用Picker实现一个简单的ColorPicker弹窗

    在上一篇博文<[UWP]使用Popup构建UWP Picker>中我们简单讲述了一下使用Popup构建适用于MVVM框架下的弹窗层组件Picker的过程.但是没有应用实例的话可能体现不出P ...

  9. 任务调度及远端管理(基于Quartz.net)

    这篇文章我们来了解一些项目中的一个很重要的功能:任务调度 可能有些同学还不了解这个,其实简单点说任务调度与数据库中的Job是很相似的东西 只不过是运行的物理位置与管理方式有点不一样,从功能上来说我觉得 ...

  10. Android开发 - 掌握ConstraintLayout(一)传统布局的问题

    在传统的Android开发中,页面布局占用了我们很多的开发时间,而且面对复杂页面的时候,传统的一些布局会显得非常复杂,每种布局都有特定的应用场景,我们通常需要各种布局结合起来使用来实现复杂的页面.随着 ...