首页 > 其他分享 >spark的DataFrame的schema模式:读时模式, 指定模式

spark的DataFrame的schema模式:读时模式, 指定模式

时间:2023-02-13 22:44:56浏览次数:31  
标签:读时 val df DataFrame json 模式 path schema

读时模式

    val path="/Volumes/Data/BigData_code/data/"
    //读取json生成dataframe
    val df = spark.read.format("json").load(path + "flight-data/json/2015-summary.json")
    df.printSchema()

读时模式是通过前几行的数据,来对各个列进行推断各个列的数据类型。优点是方便。但是,读时模式会造成精度损失。因为在前几行推断出是int类型,但是,实际是long类型。

指定模式

方法1:使用StructType实现指定

    val path="/Volumes/Data/BigData_code/data/"
    //自定义schema模式
    val mySchema = StructType(Array(
      StructField("DEST_COUNTRY_NAME", StringType, true),
      StructField("ORIGIN_COUNTRY_NAME", StringType, true),
      StructField("count", LongType, false, Metadata.fromJson("{\"home\":\"world\"}"))
    ))
    //生成DataFrame
    val df = spark.read.format("json").schema(mySchema) //使用自定义的schema模式
      .load(path + "flight-data/json/2015-summary.json")
    df.printSchema()

方法2:使用case class实现指定

    val path="/Volumes/Data/BigData_code/data/"
    //自定义schema模式
    case class myClass (
         DEST_COUNTRY_NAME:String,ORIGIN_COUNTRY_NAME:String,count:Long
                           )
    val mySchema = Encoders.product[myClass].schema
    //生成DataFrame
    val df = spark.read.format("json").schema(mySchema) //使用自定义的schema模式
      .load(path + "flight-data/json/2015-summary.json")
    df.printSchema()

假如,不需要指定列名可以使用以下方法:

    val path="/Volumes/Data/BigData_code/data/"
    //自定义schema模式
    val mySchema = Encoders.product[(String, String, Long)].schema
    //生成DataFrame
    val df = spark.read.format("json").schema(mySchema) //使用自定义的schema模式
      .load(path + "flight-data/json/2015-summary.json")
    df.printSchema()

注意:这里有给默认的列名:_1,_2,_3。自己可以使用printSchema输出一下。

标签:读时,val,df,DataFrame,json,模式,path,schema
From: https://www.cnblogs.com/ALINGMAOMAO/p/17118120.html

相关文章

  • spark DataFrame聚合操作
    在聚合操作中,需要指定键或分组方式,以及指定如何转换一列或多列数据的聚合函数。s除了处理任意类型的值之外,Spark还可以创建以下分组类型:最简单的分组通过在select语句......
  • 文盘Rust -- 领域交互模式如何实现
    作者:京东科技贾世闻文盘Rust--领域交互模式如何实现书接上文,上回说到如何通过​​interactcli-rs​​四步实现一个命令行程序。但是shell交互模式在有些场景下用户体验并......
  • 文盘Rust -- 领域交互模式如何实现
    作者:京东科技贾世闻文盘Rust--领域交互模式如何实现书接上文,上回说到如何通过interactcli-rs四步实现一个命令行程序。但是shell交互模式在有些场景下用户体验并不是......
  • 代理设计模式
    代理设计模式​​1、代理设计模式​​​​1.1静态代理模式​​​​1.2动态代理模式​​1、代理设计模式  所谓代理,就是替别人完成一些事情。在Java开发中,我们也会遇到一......
  • Redis主从模式的优缺点
    优点:一个Master可以同步多个SlavesSlave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。因此我们可以将Redis的Replication架构视为图结......
  • 什么是设计模式?
    所谓设计模式,就是对经常出现的软件设计问题的成熟解决方案。很多人把设计模式想象成非常高深的概念,实际上设计模式仅仅是对特定问题的一种惯性思维。有些人喜欢抱着一本设......
  • Docker网络模式
    一、docker网络概述1、docker网络实现的原理Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP......
  • java——spring boot集成RabbitMQ——路由模式——应用场景
    如果多个队列都绑定了同一个交换机,通过路由key,指定消息到哪个消息队列     ......
  • java——spring boot集成RabbitMQ——发布/订阅模式——实现生产者
        首先抽离出来连接,单据一个工具类:                                     ......
  • java——spring boot集成RabbitMQ——简单模式示例——实现消费者
    1、引入依赖                                               ......