Spark SQL数据源:Parquet文件

news2025/2/12 15:03:26

文章目录

  • 一、Parquet简介
  • 二、读取和写入Parquet的方法
    • (一)利用parquet()方法读取parquet文件
      • 1、数据准备
      • 2、读取parquet文件
      • 3、显示数据帧内容
    • (二)利用parquet()方法写入parquet文件
      • 1、写入parquet文件
      • 2、查看生成的parquet文件
  • 三、Schema合并
    • (一)Schema合并简介
    • (二)开启Schema合并功能
      • 1、利用option()方法设置
      • 2、利用config()方法设置
    • (三)案例演示Schema合并
      • 1、提出任务
      • 2、完成任务


一、Parquet简介

Apache Parquet是Hadoop生态系统中任何项目都可以使用的列式存储格式,不受数据处理框架、数据模型和编程语言的影响。Spark SQL支持对Parquet文件的读写,并且可以自动保存源数据的Schema。当写入Parquet文件时,为了提高兼容性,所有列都会自动转换为“可为空”状态。

二、读取和写入Parquet的方法

加载和写入Parquet文件时,除了可以使用load()方法和save()方法外,还可以直接使用Spark SQL内置的parquet()方法

(一)利用parquet()方法读取parquet文件

1、数据准备

执行命令:cd $SPARK_HOME/examples/src/main/resources,查看Spark的样例数据文件 users.parquet
在这里插入图片描述
将users.parquet上传到hdfs的/input目录,执行命令:hdfs dfs -put users.parquet /input
hdfs dfs -put users.parquet /input
在这里插入图片描述

2、读取parquet文件

使用集群方式启动spark shell
在这里插入图片描述

执行命令:val usersdf = spark.read.parquet(“hdfs://master:9000/input/users.parquet”)
在这里插入图片描述

3、显示数据帧内容

执行命令:usersdf.show()
在这里插入图片描述

(二)利用parquet()方法写入parquet文件

1、写入parquet文件

执行命令:usersdf.select(“name”, “favorite_color”).write.parquet(“hdfs://master:9000/result”)
在这里插入图片描述
报错说/result目录已经存在,有两种解决问题的方式,一个是删除result目录,一个是修改命令,设置覆盖模式

导入SaveMode类:import org.apache.spark.sql.SaveMode后,执行命令:usersdf.select(“name”, “favorite_color”).write.mode(SaveMode.Overwrite)parquet(“hdfs://master:9000/result”)
在这里插入图片描述

2、查看生成的parquet文件

在slave1虚拟机上执行命令:hdfs dfs -ls /result
在这里插入图片描述

三、Schema合并

(一)Schema合并简介

与Protocol Buffer、Avro和Thrift一样,Parquet也支持Schema合并。刚开始可以先定义一个简单的Schema,然后根据业务需要逐步向Schema中添加更多的列,最终会产生多个Parquet文件,各个Parquet文件的Schema不同,但是相互兼容。对于这种情况,Spark SQL读取Parquet数据源时可以自动检测并合并所有Parquet文件的Schema。

(二)开启Schema合并功能

由于Schema合并是一个相对耗时的操作,并且在多数情况下不是必需的,因此从Spark 1.5.0开始默认将Schema自动合并功能关闭,可以通过两种方式开启。

1、利用option()方法设置

读取Parquet文件时,通过调用option()方法将数据源的属性mergeSchema设置为true

val mergedDF = spark.read.option("mergeSchema", "true").parquet("hdfs://master:9000/input")

2、利用config()方法设置

构建SparkSession对象时,通过调用 config() 方法将全局SQL属性 spark.sql.parquet.mergeSchema 设置为true

val spark = SparkSession.builder()
  .appName("SparkSQLDataSource")
  .config("spark.sql.parquet.mergeSchema", true)
  .master("local[*]")  
  .getOrCreate()

(三)案例演示Schema合并

1、提出任务

向HDFS的目录/students中首先写入两个学生的姓名和年龄信息,然后写入两个学生的姓名和成绩信息,最后读取/students目录中的所有学生数据并合并Schema。

2、完成任务

建SchemaMergeDemo单例对象
在这里插入图片描述

package net.army.sql.day01

import org.apache.spark.sql.{SaveMode, SparkSession}

/**
 * 功能:演示Schema合并
 * 日期:2023年06月14日
 * 作者:梁辰兴
 */
object SchemaMergeDemo {
  def main(args: Array[String]): Unit = {
    // 创建或得到SparkSession
    val spark = SparkSession.builder()
      .appName("SparkSQLDataSource")
      .config("spark.sql.parquet.mergeSchema", true)
      .master("local[*]")
      .getOrCreate()

    // 导入隐式转换
    import spark.implicits._

    // 创建列表集合,存储姓名和年龄
    val studentList1 = List(("李克文", 23), ("张晓琳", 28))
    // 将列表集合转为数据帧,并指定列名name和age
    val studentDF1 = spark.sparkContext
      .makeRDD(studentList1)
      .toDF("name", "age")
    // 输出数据帧内容
    studentDF1.show()
    // 将数据帧写入HDFS指定目录
    studentDF1.write.mode(SaveMode.Append)
      .parquet("hdfs://master:9000/students")

    // 创建列表集合,存储姓名和成绩
    val studentList2 = List(("梁辰兴", 66), ("陈鸿宇", 78))
    // 将列表集合转为数据帧,并指定列名name和age
    val studentDF2 = spark.sparkContext
      .makeRDD(studentList2)
      .toDF("name", "score")
    // 输出数据帧内容
    studentDF2.show()
    // 将数据帧写入HDFS指定目录
    studentDF2.write.mode(SaveMode.Append)
      .parquet("hdfs://master:9000/students")

    // 读取指定目录下多个文件
    val mergedDF = spark.read.option("mergeSchema", true)
      .parquet("hdfs://master:9000/students")
    // 输出Schema信息
    mergedDF.printSchema()
    // 输出数据帧内容
    mergedDF.show()
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/645563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Security--多个过滤器链和多个用户表

请求从客户端出发,到达客户端,也就是servlet,中间有很多过滤器的,其中就有一个过滤器链代理,里面包含了过滤器的一个集合。而且Spring Security Filter并不是直接嵌入到Web Filter中的,而是通过FilterChain…

海纳“千川”:得物多场景统一推荐平台|精选

1 千川由来 得物的推荐场景,除了首页瀑布流等几个比较大的场景之外,还有很多长尾的小场景,包括:频道、会场、购中购后场景、品牌墙等。这类场景存在单个场景体量小(UV和GMV均偏小)、场景零散、类型多元的情…

炫龙笔记本怎么用U盘重装Win10系统?

炫龙笔记本怎么用U盘重装Win10系统?很多使用炫龙笔记本电脑的用户在问,怎么使用U盘来重装一下电脑的Win10系统,这时候用户先要准备一个U盘,还有一个能够正常联网的炫龙笔记本电脑,最后按照以下炫龙笔记本用U盘重装Win1…

可算是熬出头了,测试3年,费时6个月,入职阿里,涨薪14K

本科毕业后就一直从事测试的工作,和多数人一样,最开始从事点点点的工作,看着自己的同学一步一步往上走,自己还是在原地踏步,说实话这不是自己想要的状态。 一年半后开始沪漂生活,又摸爬滚打了一年半&#…

FL Studio21.0.3最新版本下载 可切换中文语言

FL Studio是最好的! 在我12/13岁的时候,一个DJ向我介绍了FL Studio。它让我大吃一惊,怎么能在几秒钟内做出一个鼓的模式。后来我又玩了好几年,到了15岁时,我确定我想成为一名制作人。FL Studio帮助我把脑海中的想法快速地变成一个…

开发者必备:动态贴纸和美颜SDK的集成教程

动态贴纸和美颜技术不仅能带来多样的拍摄方案,还可以增加应用的吸引力。本篇文章将为开发者提供动态贴纸和美颜SDK的集成教程、技术方案,帮助开发者快速实现这些功能。 一、动态贴纸美颜SDK集成教程 导入SDK 在Android Studio中,开发者需要…

柴油发电机供电技巧,太有用了!

随着现代工业和商业的发展,对可靠的电力供应的需求变得越来越重要。在许多场景中,柴油发电机作为备用电源成为了关键设备,用于应对停电或电力故障时的紧急情况。 然而,对于企业和组织来说,有效监控和管理柴油发电机的运…

自学黑客!告诉你如何规划

博主本人 18年就读于一所普通的本科学校,21年 6 月在三年经验的时候顺利通过校招实习面试进入大厂,现就职于某大厂安全联合实验室。 我为啥说自学黑客 (网络安全),一般人我还是劝你算了吧。因为我就是那个不一般的人。…

Jwt过期时间

最近在复习Spring Security,发现测试jwt解密的时候会报错,之前没有问题,但是最近几次都出现了问题,我决定究其原因。 debug看一下, 进入真正的解析 看一下这里的源码 Override public Jwt parse(String jwt) throws …

Ansible 部署

ansible 自动化运维工具,可以实现批量管理多台(成百上千)主机,应用级别的跨主机编排工具 特性: 无agent的存在,不要在被控制节点上安装客户端应用 通过ssh协议与被控制节点通信 基于模块工作的&#xff0c…

面试华为,足足花了2个月才上岸,真的难呀····

花2个月时间面试一家公司,你们觉得值吗? 背景介绍 二本计算机专业,代码能力一般,之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发,第二份实习由于大三暑假回国的时间比…

chatgpt赋能python:Python如何打包APK

Python如何打包APK Python是现代编程语言中最流行的之一,它是一种易于学习和使用的语言,因为它拥有直观的语法并且具有许多强大的工具和库。其互动性和可移植性使得Python适合用于开发各种类型的应用程序,包括移动应用程序。 在本文中&…

Android Retrofit 给你的接口加上缓存

转载请注明出处:https://blog.csdn.net/kong_gu_you_lan/article/details/131200501?spm1001.2014.3001.5501 本文出自 容华谢后的博客 往期回顾: Android Retrofit RxJava使用详解 Android 探讨一下Retrofit封装的最佳姿势 Android 谈谈我所理解的…

数据分析规范总结-V2.0

结构规范及写作 报告常用结构: 1. 架构清晰、主次分明 数据分析报告要有一个清晰的架构,层次分明能降低阅读成本,有助于信息的传达。虽然不同类型的分析报告有其适用的呈现方式,但总的来说作为议论文的一种,大部分的分…

C语言之函数栈帧的创建与销毁讲解(2)

上一篇博客我们讲到了函数栈帧的创建与销毁(1)今天我们来讲解Add函数的函数栈帧相关知识 在开始本章博客之前,大家可以把上一篇博客的主要内容仔细复习一下 看图 第一个mov:把b的值放到eax里面去 第二个mov:把a的…

wangEditor富文本编辑器的调用开发实录(v5版本、获取HTML内容、上传图片、隐藏上传视频)

wangEditor 是一款基于原生 JavaScript 封装,开源免费的富文本编辑器,支持常规的文字排版操作、插入图片、插入视频、插入代码等功能,同时提供多样化的扩展功能(如字体、颜色、表情、代码、地图等插件),支持…

SpringBoot(运维篇)

SpringBoot运维篇 SpringBoot程序的打包和运行 程序打包 SpringBoot程序是基于Maven创建的,在Maven中提供有打包的指令,叫做package。本操作可以在Idea环境下执行 mvn package打包后会产生一个与工程名类似的jar文件,其名称由模块名版本号…

小程序开发:如何从零开始建立你的第一个小程序

你可能有一个小程序的想法,但它仍然是一个想法。对于开发人员来说,这是一项艰巨的任务,因为你必须确保你有足够的时间来开发你的第一个小程序。如果你决定使用小程序,那就有很多事情要做。创建一个小程序可能是一件非常耗时的事情…

无线蓝牙耳机推荐有哪些?八大无线蓝牙耳机排行

在近几年蓝牙耳机的飞速发展,我们对于音乐和通讯的需求也越来越高。传统的耳机和听筒虽然能够满足我们基本的听觉需求,但是它们也带来了一些问题,比如:长时间佩戴会导致耳朵疲劳、引起耳道炎等。针对这些问题,蓝牙耳机…

解决Dbeaver连接一段时间不操作后断开的问题

1、首先右键数据库连接点击【编辑连接】 2、点击【初始化】将【连接保持】改成60s,这样数据库就不会自己断开了