sparkSQL----sql简介 创建DataFrame sparksql读取各种文件 Dataset的Encoder

本文介绍了Spark SQL的基本概念,包括DataFrame的性质,如它结合了RDD和Schema的优势,提供了更高的效率和灵活性。DataFrame是Dataset[Row]的特殊形式,具备执行计划,便于优化。文章还强调了Spark SQL的特性,如易整合、统一的数据格式、对Hive的支持以及标准的数据连接。此外,详细讲述了创建DataFrame的三种方法,并探讨了Spark SQL读取JSON、JDBC、Parquet、CSV和ORC文件的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sparksql简介

Spark SQL是Spark用来处理结构化数据

RDD + Schema = 可以先生成逻辑计划(DAG), 在优化后生成物理计划(Task)

Dataset: 更加智能的RDD, 有Encoder并且在Encoder有Schema和序列化和反序列化方法, 还带有执行计划

               有执行计划, 先根据你对Dataset的操作生成逻辑计划, 然后在生成优化过的逻辑计划, 最后生成进一步优化的物理计划

               强数据类型, 将数据放在堆外内存, 效率更高, 更加节省空间, 内存管理起来更加灵活高效

DataFrame: 是Dataset[Row]的一种特殊格式

                     DataFrame相当于RDD+Schema, 有了更多的描述信息

                     有rowEncoder, 并且还有schema

                     强数据类型, 将数据放在堆外内存, 效率更高, 更加节省空间, 内存管理起来更加灵活高效

网站(spark.apache.org/sql)

1. 什么是DataFrames?  

与RDD类似, DataFrame也是一个分布式数据容器[抽象的], 然而DataFrame更像传统数据库的二维表格, 除了RDD的描述数据以外, 还记录数据的结构信息, 即 schema,

与hive相似, DataFrame也支持嵌套数据类型(struct, array和map)

DataFrame = RDD + Schema【更加详细的结构化描述信息】,以后在执行就可以生成执行计划,进行优化,是Dataset的一种特殊格式

2. sparksql特性

1) 易整合

            Spark SQL使得在spark编程中可以混搭SQL和算子API编程

2) 统一的数据格式

           Spark SQL为各类不同数据源提供统一的访问方式,可以跨各类数据源进行愉快的join;所支持的数据源包括但不限于: Hive / Avro / CSV / Parquet / ORC / JSON / JDBC等;

3) 兼容Hive

           Spark SQL支持HiveQL语法及Hive的SerDes、UDFs,并允许你访问已经存在的Hive数仓数据;

4) 标准的数据连接

           Spark SQL的server模式可为各类BI工具提供行业标准的JDBC/ODBC连接,从而可以为支持标准JDBC/ODBC连接的各类工具提供无缝对接;(开发封装平台很有用哦!)

 SparkSQL可以看做一个转换层,向下对接各种不同的结构化数据源,向上提供不同的数据访问方式

 

创建DataFrame (常用第一种和第三种, 第三种是最正宗的写法)

第一种创建方法: 将RDD关联case class创建DataFrame

package cn.doit.spark.sql01

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}
/*
   将RDD关联Case class创建DataFrame
    +------+-------+------+
    |  name|subject|scores|
    +------+-------+------+
    |孙悟空|   数学|    95|
    |  娜娜|   语文|    94|
    |孙悟空|   语文|    87|
    |  宋宋|   数学|    86|
    |  婷婷|   数学|    85|
    |  娜娜|   英语|    84|
    |  宋宋|   英语|    84|
    |  婷婷|   英语|    78|
    |孙悟空|   英语|    68|
    |  婷婷|   语文|    65|
    |  宋宋|   语文|    64|
    |  娜娜|   数学|    56|
    +------+-------+------+
 */
object DataFrameCreateDemo01 {

  def main(args: Array[String]): Unit = {

    //创建SparkConf, 然后创建SparkContext
    //使用SparkContext创建RDD
    //调用RDD的算子(Transformation和Action')
    //释放资源 sc.stop


    //创建SparkSession  builder(构建)  getOrCreate(创建)
    val spark: SparkSession = SparkSession.builder()
      .appName("DataFrameCreateDemo01")
      .master("local[*]")
      .getOrCreate()

    val sc = spark.sparkContext
    val rdd1: RDD[String] = sc.textFile("hdfs://linux01:8020/tb_stu")
    val rdd2: RDD[User] = rdd1.map(e => {
      val fields = e.split("\t")
      User(fields(0), fields(1), fie
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值