Spark SQL数据源:Parquet文件

news/2024/11/29 21:35:46/

文章目录

  • 一、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.day01import org.apache.spark.sql.{SaveMode, SparkSession}/*** 功能:演示Schema合并* 日期:2023年06月14日* 作者:梁辰兴*/
object SchemaMergeDemo {def main(args: Array[String]): Unit = {// 创建或得到SparkSessionval spark = SparkSession.builder().appName("SparkSQLDataSource").config("spark.sql.parquet.mergeSchema", true).master("local[*]").getOrCreate()// 导入隐式转换import spark.implicits._// 创建列表集合,存储姓名和年龄val studentList1 = List(("李克文", 23), ("张晓琳", 28))// 将列表集合转为数据帧,并指定列名name和ageval 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和ageval 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.ppmy.cn/news/382129.html

相关文章

Spark SQL数据源:JSON数据集

文章目录 一、读取JSON文件简介二、读取JSON文件案例演示(一)创建JSON文件并上传到HDFS(二)读取JSON文件,创建临时表,进行关联查询1、读取user.json文件,创建临时表t_user2、读取score.json文件…

快速打开打印OFD电子发票

OFD是国家版式文件格式标准,是国家电子文件体系的重要组成部分,也是电子发票的标准格式,那么如果很多OFD电子发票,通过阅读器查看,效率太低,那么有什么好的办法轻松管理大量的电子发票呢?好票友…

打印票据--java

import java.util.Random; class commodity{ //商品private String type,size;public commodity(String s) { types;}public String getType() { return type; }public String getSize() { return size; }public double price() { return 0; }public vo…

web应用票据打印实现(四)

上一篇中,我们已经通过iText生成了共打印的pdf文档,如果没有特别的要求,利用浏览器的pdf插件来预览和打印已经能供满足我们Web应用在浏览器端实现票据套打的要求了。但在我们的项目中,客户要求一次操作之后连续进行打印&#xff0…

web应用票据打印实现(一)

许多web应用的开发中都会涉及到票据打印的功能。常用的Web打印实现的方式有&#xff1a; 1.浏览器打印接口 调用window.print()方法&#xff0c;调用打印机功能打印当前窗口的内容&#xff0c;与单击浏览器的打印按钮效果一致。示例代码如下&#xff1a; <html> …

怎么在一张A4纸上打印2张发票?

平时我们在打印发票时&#xff0c;直接打开会被放大到铺满整张A4纸&#xff0c;这样就会失真&#xff0c;那么应该怎么设置才能让一张A4纸上打印2张发票呢&#xff1f; 1、Word格式 方式1&#xff1a;首先新建一个Word文档后&#xff0c;插入2张发票&#xff0c;并适当排版在…

票据打印, 银行账单打印, 标签印刷, 文档打印, 条码打印, 批量打印, 包装纸打印与设计,可变数据打印,数据库印刷,HMI报表打印,VC++源码库解决方案

票据打印, 银行账单打印, 标签印刷, 文档打印, 条码打印, 批量打印, 包装纸打印与设计&#xff0c;可变数据打印&#xff0c;数据库印刷&#xff0c;HMI报表打印&#xff0c;VC源码库解决方案 -- 全球领先、100%源码全开放、可用于HMI组态报表打印的解决方案&#xff01;   使…

精锐万能票据打印专家

精锐万能票据打印专家是由昆明灵豚科技有限公司面向票据处理市场推出专业票据打印软件。利用该软件可轻松打印现金支票、转帐支票、旅行支票、转账支票、贷记凭证、电汇凭证、信汇凭证、进账单、现金结款单、快递单、汇/本票申请书、收据、各种证件等格式 精锐万能票据打印专家…