SparkSQL - DataFrame、DataSet

这篇具有很好参考价值的文章主要介绍了SparkSQL - DataFrame、DataSet。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        DataFrame

创建 DataFrame

SQL的简单使用

DSL 语法 

RDD 转换为 DataFrame 

DataFrame 转换为 RDD

DataSet

创建 DataSet

DataSet - DataFrame转换

RDD 转换为 DataSet 

DataSet 转换为 RDD 

RDD、DataFrame、DataSet 三者的区别 


        SparkSession 是 Spark 最新的 SQL 查询起始点,实质上是 SQLContext 和 HiveContext 的组合,所以在 SQLContex 和 HiveContext 上可用的 API 在 SparkSession 上同样是可以使用 的。SparkSession 内部封装了 SparkContext,所以计算实际上是由 sparkContext 完成的。当 我们使用 spark-shell 的时候, spark 框架会自动的创建一个名称叫做 spark 的 SparkSession 对 象, 就像我们以前可以自动获取到一个 sc 来表示 SparkContext 对象一样

SparkSQL - DataFrame、DataSet

DataFrame

         Spark SQL 的 DataFrame API 允许我们使用 DataFrame 而不用必须去注册临时表或者 生成 SQL 表达式。DataFrame API 既有 transformation 操作也有 action 操作。

创建 DataFrame

        在 Spark SQL 中 SparkSession 是创建 DataFrame 和执行 SQL 的入口,创建 DataFrame 有三种方式:通过 Spark 的数据源进行创建;从一个存在的 RDD 进行转换;还可以从 Hive Table 进行查询返回。 

从 Spark 数据源进行创建查看 Spark 支持创建文件的数据源格式

spark.read.

SparkSQL - DataFrame、DataSet

        在 spark 的 bin/data 目录中创建 user.json 文件

SparkSQL - DataFrame、DataSet

         将以下内容写入文件中

{"username":"zhangsan","age":20}

SparkSQL - DataFrame、DataSet

         读取 json 文件创建 DataFrame

val df = spark.read.json("input/user.json")

SparkSQL - DataFrame、DataSet

         如果从内存中获取数据,spark 可以知道数据类型具体是什么。如果是数字,默认作 为 Int 处理;但是从文件中读取的数字,不能确定是什么类型,所以用 bigint 接收,可以和 Long 类型转换,但是和 Int 不能进行转换 

        展示结果

df.show

SparkSQL - DataFrame、DataSet

SQL的简单使用

        SQL 语法风格是指我们查询数据的时候使用 SQL 语句来查询,这种风格的查询必须要 有临时视图或者全局视图来辅助。

        读取 JSON 文件创建 DataFrame

val df = spark.read.json("input/user.json")

SparkSQL - DataFrame、DataSet        对 DataFrame 创建一个临时表

df.createOrReplaceTempView("user")

        通过 SQL 语句实现查询全表

val Sdf = spark.sql("select * from user")

SparkSQL - DataFrame、DataSet

         查询结果展示

SparkSQL - DataFrame、DataSet

        普通临时表是 Session 范围内的,如果想应用范围内有效,可以使用全局临时表。使 用全局临时表时需要全路径访问,如:global_temp.user

         对于 DataFrame 创建一个全局表有 

df.createOrReplaceGlobalTempView("emp")

        通过 SQL 语句实现查询全表

spark.sql("SELECT * FROM global_temp.emp").show()

SparkSQL - DataFrame、DataSet

spark.newSession().sql("SELECT * FROM global_temp.emp").show()

SparkSQL - DataFrame、DataSet

DSL 语法 

        DataFrame 提供一个特定领域语言(domain-specific language, DSL)去管理结构化的数据。 可以在 Scala, Java, Python 和 R 中使用 DSL,使用 DSL 语法风格不必去创建临时视图了

        创建一个 DataFrame 

val df = spark.read.json("input/user.json")

        查看 DataFrame 的 Schema 信息 

df.printSchema

SparkSQL - DataFrame、DataSet

         只查看"age"列数据

df.select("age").show

SparkSQL - DataFrame、DataSet

        查看"username"列数据以及"age+1"数据\

        涉及到运算的时候, 每列都必须使用$, 或者采用引号表达式:单引号+字段名

df.select($"username",$"age"+1).show

SparkSQL - DataFrame、DataSet

df.select('username,'age+1).show

SparkSQL - DataFrame、DataSet

        查看"age"大于"15"的数据 

df.filter('age > 15).show

SparkSQL - DataFrame、DataSet

        按照"age"分组,查看数据条数

df.groupBy("age").count.show

SparkSQL - DataFrame、DataSet

RDD 转换为 DataFrame 

        在 IDEA 中开发程序时,如果需要 RDD 与 DF 或者 DS 之间互相操作,那么需要引入 import spark.implicits._

        这里的 spark 不是 Scala 中的包名,而是创建的 sparkSession 对象的变量名称,所以必 须先创建 SparkSession 对象再导入。这里的 spark 对象不能使用 var 声明,因为 Scala 只支持 val 修饰的对象的引入。

spark-shell 中无需导入,自动完成此操作。

 val rdd = sc.textFile("input/id.txt")
//toDF(列名1、列名2,……) 
 val df = rdd.toDF("id") 
 df.show

SparkSQL - DataFrame、DataSet

        实际开发中,一般通过样例类将 RDD 转换为 DataFrame 

DataFrame 转换为 RDD

        DataFrame 其实就是对 RDD 的封装,所以可以直接获取内部的 RDD

var rdd1 = df.rdd
rdd1.collect

SparkSQL - DataFrame、DataSet

DataSet

        DataSet 是具有强类型的数据集合,需要提供对应的类型信息。

创建 DataSet

        使用样例类序列创建 DataSet

scala> case class Person(name: String, age: Long)
defined class Person

scala> val list = List(Person("张三",30),Person("李四",40))
list: List[Person] = List(Person(张三,30), Person(李四,40))

scala> list.toDS.show

SparkSQL - DataFrame、DataSet

         使用基本类型的序列创建 DataSet

scala> val ds = Seq(1,2,3,4,5).toDS
ds: org.apache.spark.sql.Dataset[Int] = [value: int]
scala> ds.show
+-----+
|value|
+-----+
| 1|
| 2|
| 3|
| 4|
| 5|
+-----+

        在实际使用的时候,很少用到把序列转换成DataSet,更多的是通过RDD来得到DataSet

DataSet - DataFrame转换

         DataFrame转成DataSet

scala> val rdd = List(1,2,3,4)
rdd: List[Int] = List(1, 2, 3, 4)

scala> val df = rdd.toDF
df: org.apache.spark.sql.DataFrame = [value: int]

scala> df.show
+-----+
|value|
+-----+
|    1|
|    2|
|    3|
|    4|
+-----+


scala> case class Age(value : Int)
defined class Age

scala> val ds = df.as[Age] //转换为DataSet
ds: org.apache.spark.sql.Dataset[Age] = [value: int]

scala> ds.show
+-----+
|value|
+-----+
|    1|
|    2|
|    3|
|    4|
+-----+

        DataSet 转成 DataFrame

scala> val oldDf = ds.toDF
oldDf: org.apache.spark.sql.DataFrame = [value: int]

RDD 转换为 DataSet 

         SparkSQL 能够自动将包含有 case 类的 RDD 转换成 DataSet,case 类定义了 table 的结 构,case 类属性通过反射变成了表的列名。Case 类可以包含诸如 Seq 或者 Array 等复杂的结 构。

cala> case class User(name:String, age:Int)
defined class User

scala> val rdd = sc.makeRDD(List(("zhangsan",30), ("lisi",49))).map(t=>User(t._1,t._2))
rdd: org.apache.spark.rdd.RDD[User] = MapPartitionsRDD[8] at map at <console>:26

scala> val ds = rdd.toDS
ds: org.apache.spark.sql.Dataset[User] = [name: string, age: int]

DataSet 转换为 RDD 

        DataSet 其实也是对 RDD 的封装,所以可以直接获取内部的 RDD

scala> case class User(name:String, age:Int)
defined class User

scala> val ds = sc.makeRDD(List(("zhangsan",30), ("lisi",49))).map(t=>User(t._1,t._2)).toDS
ds: org.apache.spark.sql.Dataset[User] = [name: string, age: int]

scala> val rdd = ds.rdd
rdd: org.apache.spark.rdd.RDD[User] = MapPartitionsRDD[6] at rdd at <console>:25

scala> rdd.collect
res3: Array[User] = Array(User(zhangsan,30), User(lisi,49))

RDD、DataFrame、DataSet 三者的区别 

         RDD

  1. RDD 一般和 spark mllib 同时使用 
  2. RDD 不支持 sparksql 操作

DataFrame 

  1. 与 RDD 和 Dataset 不同,DataFrame 每一行的类型固定为 Row,每一列的值没法直 接访问,只有通过解析才能获取各个字段的值
  2.  DataFrame 与 DataSet 一般不与 spark mllib 同时使用➢
  3. DataFrame 与 DataSet 均支持 SparkSQL 的操作,比如 select,groupby 之类,还能 注册临时表/视窗,进行 sql 语句操作
  4.  DataFrame 与 DataSet 支持一些特别方便的保存方式,比如保存成 csv,可以带上表 头,这样每一列的字段名一目了然(后面专门讲解)

DataSet 

  1. Dataset 和 DataFrame 拥有完全相同的成员函数,区别只是每一行的数据类型不同。 DataFrame 其实就是 DataSet 的一个特例 type DataFrame = Dataset[Row] ➢
  2. DataFrame 也可以叫 Dataset[Row],每一行的类型是 Row,不解析,每一行究竟有哪 些字段,各个字段又是什么类型都无从得知,只能用上面提到的 getAS 方法或者共 性中的第七条提到的模式匹配拿出特定字段。而 Dataset 中,每一行是什么类型是 不一定的,在自定义了 case class 之后可以很自由的获得每一行的信息

附尚硅谷绘制的 RDD、DataFrame、DataSet三者转换关系图

SparkSQL - DataFrame、DataSet文章来源地址https://www.toymoban.com/news/detail-412501.html

到了这里,关于SparkSQL - DataFrame、DataSet的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spark SQL、DataFrame、DataSet是什么

    在很多情况下,开发人员并不了解Scala语言,也不了解Spark常用的API,但又非常想要使用Spark框架提供的强大的数据分析能力。Spark的开发工程师们考虑到了这个问题,于是利用SQL语言的语法简洁、学习门槛低以及在编程语言中普及程度和流行程度高等诸多优势,开发了Spark S

    2024年02月12日
    浏览(37)
  • Spark的核心概念:RDD、DataFrame和Dataset

    Apache Spark,其核心概念包括RDD(Resilient Distributed Dataset)、DataFrame和Dataset。这些概念构成了Spark的基础,可以以不同的方式操作和处理数据,根据需求选择适当的抽象。 RDD是Spark的基本数据抽象,它代表一个不可变、分布式的数据集合。下面我们将更详细地探讨RDD: RDD的特性

    2024年02月04日
    浏览(28)
  • Spark(39):Streaming DataFrame 和 Streaming DataSet 输出

    目录 0. 相关文章链接 1. 输出的选项 2. 输出模式(output mode) 2.1. Append 模式(默认) 2.2. Complete 模式 2.3. Update 模式 2.4. 输出模式总结 3. 输出接收器(output sink) 3.1. file sink 3.2. kafka sink 3.2.1. 以 Streaming 方式输出数据 3.2.2. 以 batch 方式输出数据 3.3. console sink 3.4. memory sink 3.5. fo

    2024年02月13日
    浏览(30)
  • python学习——pandas库的使用之series及DataFrame创建、查看、切片、运算

    Pandas是基于NumPy的数据分析模块 Pandas纳入了大量库和一些标准的数据模型,提供了高效操作大型数据集所需的工具 Pandas提供了大量能使我们快速便捷处理数据的函数和方法 Pandas的数据结构 Series :带标签的一维数组,与Numpy中的一维array类似。与列表也很相近。 区别是:列表

    2024年02月03日
    浏览(42)
  • python入门——DataFrame创建和索引

    DataFrame是Pandas中常用的数据结构,即表示矩阵的数据表,包含已排序的列集合,既有行索引又有列索引。使用前需先导入pandas(import pandas as pd)。 一、DataFrame的创建 1、利用包含等长度列表活Numpy数组的字典创建。 可以看到创建的DataFrame如下: 2、利用嵌套字典创建 3、 用Data

    2024年02月09日
    浏览(53)
  • Python 之 Pandas DataFrame 数据类型的简介、创建的列操作

    DataFrame 是 Pandas 的重要数据结构之一,也是在使用 Pandas 进行数据分析过程中最常用的结构之一,可以这么说,掌握了 DataFrame 的用法,你就拥有了学习数据分析的基本能力。 DataFrame 是一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表

    2024年02月06日
    浏览(29)
  • 如何使用pytorch的Dataset, 来定义自己的Dataset

    Dataset与DataLoader的关系 Dataset: 构建一个数据集,其中含有所有的数据样本 DataLoader:将构建好的Dataset,通过shuffle、划分batch、多线程num_workers运行的方式,加载到可训练的迭代容器。 实战1:CSV数据集(结构化数据集) 实战2:图片数据集 ├── flower_data —├── flower_photo

    2024年01月22日
    浏览(40)
  • 【Python】数据科学工具(Numpy Pandas np.array() 创建访问数组 向量与矩阵 Series DataFrame)

    1.Numpy numpy是Python中一个非常重要的科学计算库,其最基础的功能就是N维数组对象——ndarray。 1.1 数组的创建 1)np.array() 用 np.array() 函数可以将Python的序列对象(如列表、元组)转换为ndarray数组。 2)arange、linspace、logspace np.arange(start, stop, step) :创建一个一维数组,其中的值

    2024年02月10日
    浏览(32)
  • 使用docker简单创建一个python容器

     /root/docker_python目录结构: main.py内容: docker-compose.yml内容: 其中  stdin_open  相当于  run  命令中的  -d , 其中  tty  相当于  run  命令中的  -i stdin_open: true tty: true 其中networks可以使用已创建网络,假设xxx为已创建的网络 networks:   xxx:     external: true 设置容器时区 environ

    2024年02月16日
    浏览(30)
  • 使用Pygame创建一个简单游戏界面

    首先需要安装Pygame 模块,在Python代码中添加引用。 1. 引用代码如下: 2. 定义初始化窗口函数: 在初始化窗口函数中,定义窗口大小和窗口标题。 3. 创建一个循环,不断更新界面和检测事件 加载背景图片,将背景图片对象放置在窗口上,位置(0,0) 最左角,图片有实际的

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包