1、sparksql是Spark用来处理结构化数据的一个模块,它提供了两个抽象DataFrame和DataSet并且作为分布式SQL查询引擎的作用。

Hive SQL转换成MapReduce然后提交到集群上执行,大大简化了编写MapReduce的程序的复杂性,由于MapReduce这种计算模型执行效率比较慢。所有Spark SQL的应运而生,它是将Spark SQL转换成RDD,然后提交到集群执行,执行效率非常快

2、DataFrame,是数据结构,类似数据库表,Dataframe的劣势在于在编译期缺少类型安全检查,导致运行时出错。

与RDD类似,DataFrame也是一个分布式数据容器。然而DataFrame更像传统数据库的二维表格,除了数据以外,还记录数据的结构信息,即schema。
同时,与Hive类似,DataFrame也支持嵌套数据类型(struct、array和map)。从API易用性的角度上看,DataFrame API提供的是一套高层的关系操作,比函数式的RDD API要更加友好,门槛更低。
由于与R和Pandas的DataFrame类似,Spark DataFrame很好地继承了传统单机数据分析的开发体验
DataFrame是为数据提供了Schema的视图。可以把它当做数据库中的一张表来对待
DataFrame也是懒执行的。
性能上比RDD要高: 定制化内存管理,数据以二进制的方式存在于非堆内存,节省了大量空间之外,还摆脱了GC的限制

3、DataSet,它是DataFrame的扩展,既具有类型安全检查也具有Dataframe的查询优化特性。

 1)是Dataframe API的一个扩展,是Spark最新的数据抽象
2)用户友好的API风格,既具有类型安全检查也具有Dataframe的查询优化特性。
3)Dataset支持编解码器,当需要访问非堆上的数据时可以避免反序列化整个对象,提高了效率。
4)样例类被用来在Dataset中定义数据的结构信息,样例类中每个属性的名称直接映射到DataSet中的字段名称。
5) Dataframe是Dataset的特列,DataFrame=Dataset[Row] ,所以可以通过as方法将Dataframe转换为Dataset。
Row是一个类型,跟Car、Person这些的类型一样,所有的表结构信息我都用Row来表示。
6)DataSet是强类型的。比如可以有Dataset[Car],Dataset[Person].
7)DataFrame只是知道字段,但是不知道字段的类型,所以在执行这些操作的时候是没办法在编译的时候检查是否类型失败的,
比如你可以对一个String进行减法操作,在执行的时候才报错,而DataSet不仅仅知道字段,而且知道字段类型,
所以有更严格的错误检查。就跟JSON对象和类对象之间的类比。

参考demo:https://github.com/asker124143222/spark-demo

示例:

package com.home.spark

import org.apache.spark.SparkConf
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession} object Ex_sparkSql {
def main(args: Array[String]): Unit = {
val conf = new SparkConf(true).setMaster("local[*]").setAppName("spark session") val spark: SparkSession = SparkSession.builder().config(conf).getOrCreate() val df: DataFrame = spark.read.json("input/userinfo.json") // df.show() df.createOrReplaceTempView("userinfo") spark.sql("select * from userinfo where age=30").show() //通过sparkSession生成rdd
val rdd: RDD[(String, String)] = spark.sparkContext.textFile("input/1.txt").map(line => {
val s = line.split(" ")
(s(0), s(1))
})
// rdd.collect().foreach(println) //rdd转换成df或者ds需要SparkSession实例的隐式转换
//导入隐式转换,注意这里的spark不是包名,而是SparkSession的对象名
import spark.implicits._ //rdd转成DataFrame
val frame: DataFrame = rdd.toDF("name","value") //DataFrame转成DataSet
val ds: Dataset[MyClass] = frame.as[MyClass] //ds转成df
val df2: DataFrame = ds.toDF() //df转成rdd
val rdd2 : RDD[Row]= df2.rdd //打印
rdd2.foreach(row=>{
println(row.getString(0)+" -- "+row.getString(1))
}) val myRDD: RDD[MyClass] = rdd.map {
case (name, value) => {
MyClass(name, value)
}
}
val myDS = myRDD.toDS() println("---"*10)
myDS.show() spark.stop()
}
} case class MyClass(name:String,value:String)

sparksql笔记的更多相关文章

  1. SparkSQL学习笔记

    概述 冠状病毒来临,宅在家中给国家做贡献之际,写一篇随笔记录SparkSQL的学习笔记,目的有二,一是记录整理之前的知识作为备忘录,二是分享技术,大家共同进步,有问题也希望大家不吝赐教.总体而言,大数 ...

  2. 【大数据】SparkSql学习笔记

    第1章 Spark SQL概述 1.1 什么是Spark SQL Spark SQL是Spark用来处理结构化数据的一个模块,它提供了2个编程抽象:DataFrame和 DataSet,并且作为分布式 ...

  3. SparkSql学习笔记(包含IDEA编写的本地代码)

    Spark SQL and DataFrame 1.为什么要用Spark Sql 原来我们使用Hive,是将Hive Sql 转换成Map Reduce 然后提交到集群上去执行,大大简化了编写MapR ...

  4. spark-sql使用笔记

    如何使用hive的udf 可以使用spark-sql --jars /opt/hive/udf.jar,指定udf的路径 还可以在spark-default.conf里指定spark.jars /op ...

  5. spark复习笔记(7):sparkSQL

    一.saprkSQL模块,使用类sql的方式访问Hadoop,实现mr计算,底层使用的是rdd 1.hive //hadoop  mr  sql 2.phenoix //hbase上构建sql的交互过 ...

  6. 大数据笔记(三十)——一篇文章读懂SparkSQL

    Spark SQL:类似Hive ======================================================= 一.Spark SQL基础 1.什么是Spark SQ ...

  7. 【Spark深入学习 -16】官网学习SparkSQL

    ----本节内容-------1.概览        1.1 Spark SQL        1.2 DatSets和DataFrame2.动手干活        2.1 契入点:SparkSess ...

  8. Spark学习笔记——读写Hbase

    1.首先在Hbase中建立一张表,名字为student 参考 Hbase学习笔记——基本CRUD操作 一个cell的值,取决于Row,Column family,Column Qualifier和Ti ...

  9. Spark Streaming笔记

    Spark Streaming学习笔记 liunx系统的习惯创建hadoop用户在hadoop根目录(/home/hadoop)上创建如下目录app 存放所有软件的安装目录 app/tmp 存放临时文 ...

随机推荐

  1. 【leetcode】699. Falling Squares

    题目如下: On an infinite number line (x-axis), we drop given squares in the order they are given. The i- ...

  2. Map-Amap:自定义地图

    ylbtech-Map-Amap:自定义地图 1.返回顶部 1. http://lbs.amap.com/getting-started/mapstyle 2. 2.返回顶部 1. 自定义地图,地图从 ...

  3. mvc 当中 [ValidateAntiForgeryToken] 的作用 转载https://www.cnblogs.com/hechunming/p/4647646.html

    一.CSRF是什么? CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR ...

  4. QTP中类的使用(转)

    Call Test Class Tester Dim mvarTesterName,mvarAge,mvarGender                        Sub Class_Initia ...

  5. 爬虫(二)—— 请求库(二)selenium请求库

    目录 selenium请求库 一.什么是selenium 二.环境搭建 三.使用selenium模块 1.使用chrome并设置为无GUI模式 2.使用chrome有GUI模式 3.显示等待与隐式等待 ...

  6. python基本数据类型集合set操作

    转:https://www.cnblogs.com/tina-python/p/5468495.html 一.集合的定义 set集合,是一个无序且不重复的元素集合. 集合对象是一组无序排列的可哈希的值 ...

  7. str方法

    'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', ' ...

  8. LINUX查看服务器硬件配置(转)

    LINUX查看硬件配置 1.      查看所有硬件的型号 dmidecode | more # dmidecode 2.2 SMBIOS 2.5 present. 170 structures oc ...

  9. js 中的深拷贝与浅拷贝

    在面试中经常会问到js的深拷贝和浅拷贝,也常常让我们手写,下面我们彻底搞懂js的深拷贝与浅拷贝. 在js中 Array 和 Object  这种引用类型的值,当把一个变量赋值给另一个变量时,这个值得副 ...

  10. JS设置首字母大写算法

    返回一个字符串,确保字符串的每个单词首字母都大写,其余部分小写. 像'the'和'of'这样的连接符同理. function titleCase(str) { //把字符串所有的字母变为小写,并根据空 ...