Spark大数据处理讲课笔记4.3 Spark SQL数据源 - Parquet文件

news2025/1/21 20:19:44

文章目录

  • 零、本讲学习目标
  • 一、Parquet概述
  • 二、读取和写入Parquet的方法
    • (一)利用parquet()方法读取parquet文件
      • 1、读取parquet文件
      • 2、显示数据帧内容
    • (二)利用parquet()方法写入parquet文件
      • 1、写入parquet文件
      • 2、查看生成的parquet文件
  • 三、Schema合并
    • (一)Schema合并概述
    • (二)开启Schema合并功能
      • 1、利用option()方法设置
      • 2、利用config()方法设置
    • (三)案例演示Schema合并
      • 1、提出任务
      • 2、完成任务

零、本讲学习目标

  1. 掌握Parquet文件的读取与写入
  2. 掌握如何进行耗时的Schema合并

一、Parquet概述

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

二、读取和写入Parquet的方法

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

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

1、读取parquet文件

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

2、显示数据帧内容

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

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

1、写入parquet文件

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

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.hw.sparksql

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

/**
 * 功能:演示Schema合并
 * 作者:华卫
 * 日期:2022年05月11日
 */
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(("无心剑", 99), ("陈鸿宇", 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()
  }
}
  • 运行程序,抛出两个异常
  • 第一个是IO异常:java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
    在这里插入图片描述
  • 第二个是访问控制异常:org.apache.hadoop.security.AccessControlException: Permission denied: user=Administrator, access=WRITE, inode="/students":root:supergroup:drwxr-xr-x
    在这里插入图片描述
  • 先解决第一个异常。在Windows环境中缺少winutils.exe程序而抛出异常。一般情况下,Spark运行在Linux系统上,在Windows下运行时需要安装支持插件hadoop2.7-common-bin
  • 下载链接:https://pan.baidu.com/s/1TbmAnwi4hscLtlqV9-rrXg 提取码:plis
    在这里插入图片描述
  • 解压缩到指定目录
    在这里插入图片描述
  • 设置环境变量,让系统可以搜索到winutils.exe
    在这里插入图片描述
  • 解决第二个异常。添上一句,设置HADOOP用户名属性
    在这里插入图片描述
  • 创建日志属性文件 - log4j.properties,免得看见太多Spark的log信息
    在这里插入图片描述
log4j.rootLogger=stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spark.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
  • 运行程序,查看结果
    在这里插入图片描述
  • 从输出的Schema信息和数据内容可以看出,Spark SQL在读取Parquet文件数据时,自动将不同文件的Schema信息进行合并。

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

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

相关文章

零入门kubernetes网络实战-32->基于路由技术+brigde+veth pair形成的跨主机通信方案

《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本文主要使用的技术是 路由技术Linux虚拟网桥虚拟网络设备veth pair来实现跨主机通信 该方案是flannel网络方案中的host-gw网络模型的基础。 1、总结 本…

化制为智,驭数前行 | 如何把握油气装备领域智能制造的未来?

01「智」赋未来,油燃而升 2015年,我国提出了“中国制造2025”规划,把智能制造作为两化深度融合的主攻方向,智能制造产业链所蕴藏的巨大投资机会将逐渐被市场挖掘。作为国家战略的基础,油气工程装备,特别是…

C++ 基础STL-list容器

STL-list 容器,又称双向链表容器,即该容器的底层是以双向链表的形式实现的。这意味着,list 容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中。 链表的优点:可以对任意位置进行快速插入和…

【触觉智能分享】RK3568+Debian系统如何旋转屏幕显示方向

大家在购买开发板后,默认开机进入桌面屏幕显示方向是竖屏,有些用户想修改为横屏显示,本文就用IDO-EVB3568为例,用Debian系统演示如何旋转屏幕显示方向,此方法适用于所有RK356X系列产品。 IDO-EVB3568开发板拥有四核A5…

【数据结构】--- 几分钟走进栈和队列(详解-上)

文章目录 前言🌟一、栈🌏1.1栈的概念及结构:🌏1.2实现栈的两种方式: 🌟二、栈实现(数组栈)🌏2.1结构:🌏2.2初始化:💫2.2.1第一种代码:…

Direct3D 12——纹理——纹理贴图的作用

法线贴图 在不增加三角形的情况下增加表面细节 任何一个像素它的法线都做一个扰动,通过定义不同的高度和临近位置的高度差重新计算法线 纹理定义的是任何一个点,它的相对的高度的移动,通过高度的变化改变法线 原曲面法向量n ( p) (0,1) p点…

代码随想录 LeetCode链表篇 Java

文章目录 (简单)203. 移除链表元素(中等)707. 设计链表(简单)206. 反转链表(中等)24. 两两交换链表中的节点(中等)19. 删除链表的倒数第 N 个结点&#xff08…

Schlumberger ECLIPSE CRACK

Schlumberger ECLIPSE CRACK 工业和工程软件旨在模拟Schlumberger ECLIPSE Simulation的碳氢化合物,该模拟与Shelberger的技术服务有关,以及用于预测和历史的容器中当前方程数量的最新和最新解决方案集。动态行为是各种传统和不寻常的石油和天然气模式。…

DevExpress:报表控件绑定数据库数据源的三种方式(Winform)

1.写在前面 如果你是和我一样,第一次接触DevExpress,并且因为网上资源眼花缭乱无从下手,然后脑子一转直接到DevExpress官网寻找官方使用文档的,那我们的了解顺序应该差不多是一致的。 DevExpress官网:https://www.de…

【笔试强训选择题】Day12.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目录…

Facebook 手机应用广告:在移动时代实现营销突破

在移动时代,手机已经成为人们生活的重要组成部分。随着移动互联网的普及,人们更频繁地使用手机来浏览社交媒体、获取信息和进行购物。 对于企业而言,如何在移动平台上实现营销突破,吸引用户的注意力和提升品牌价值,是…

数说热点|社恐人群运动健身指南:不想去健身房,那就在家找面墙

连杰伦都开始跳操了,你还不动动动动动起来? 随着《运动者联盟》这档体育挑战真人秀节目的完美收官,忙碌生活中的运动激情似乎又被点燃了。5月9日,周杰伦现身厦门,在活动现场和刘耕宏合体跳起了《本草纲目》&#xff0…

音视频技术开发周刊 | 293

每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 谷歌全面反攻 ChatGPT!PaLM 2、Gemini 双杀,Bard 正式开放 以上是2023 Google I/O 大会的重点内容,AI含量极高。 谷歌推拥有26000个H10…

uni-app框架的小程序开发环境

文章目录 一、下载微信开发工具安装 二、构建uni-app开发环境2.1 Node.js下载与安装2.2 下载HBuilder-X2.3 创建uni-app项目2.4 填入uni-app专属标识和小程序标识 在阅读此博文前,需要注册完毕小程序账号 一、下载微信开发工具 微信开发工具下载地址 下载稳定版即…

代码随想录算法训练营day41 | 343. 整数拆分,96.不同的二叉搜索树

代码随想录算法训练营day41 | 343. 整数拆分,96.不同的二叉搜索树 343. 整数拆分解法一:动态规划 96.不同的二叉搜索树解法一:动态规划 总结 343. 整数拆分 教程视频:https://www.bilibili.com/video/BV1Mg411q7YJ 1、dp[i]代表…

【Linux命令】脚本里常用的几个命令sort,uniq,tr,cut,split,eval

脚本里常用的命令 一、SORT命令1.1、语法格式1.2常用选项 二、uniq命令2.1命令格式2.2常用选项2.3小实验,过滤出现三次以上的IP地址 三、tr命令3.1语法格式3.2常用选项3.3实验 四、cut命令4.1语法格式4.2常用选项 五、split命令5.1语法格式5.2常用选项 六、eval七、…

一个优秀系统构架师应具备的能力

作为软件开发的设计架构师,那么必须拥有一定的编程技能,同时有高超的学习新的架构设计、程序设计技能。另外,我觉得作为软件架构师,还必须了解一定的硬件、网络、服务器的基本知识。要不然,你都不知道有些什么材料可以…

基于MWORKS的电动汽车电平衡分析

1 引言 随着电动汽车的快速发展、电池技术的进步和智能电力管理系统的应用,电动汽车电平衡已经成为了电动汽车技术研究中的重要问题之一。 电动汽车电平衡是指车辆发电机、蓄电池、整车用电器在一定时间内的电能供给与消耗达到平衡状态。如果车辆电能产生与消耗无法…

USART硬件流控制概念以及原理(硬件控制流以及软件控制流)

USART 数据流控制 也就是 USART_HardwareFlowControl 一、流控制的作用 这里讲到的 “流”,指的是数据流;在数据通信中,流控制是管理两个节点之间数据传输速率的过程,以防止出现接收端的数据缓冲区已满,而发送端依然…

ResNet 论文理解含视频

ResNet 论文理解 论文理解 ResNet 网络的论文名字是《Deep Residual Learning for Image Recognition》,发表在2016年的 CVPR 上,获得了 最佳论文奖。ResNet 中的 Res 也是 Residual 的缩写,它的用意在于基于 残差 学习,让神经网…