【Pyspark-驯化】spark中高效保存数据到hive表中:stored as PARQUET
本次修炼方法请往下查看
🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地!
🎇 免费获取相关内容文档关注:微信公众号,发送 pandas 即可获取
🎇 相关内容视频讲解 B站🎓 博主简介:AI算法驯化师,混迹多个大厂搜索、推荐、广告、数据分析、数据挖掘岗位 个人申请专利40+,熟练掌握机器、深度学习等各类应用算法原理和项目实战经验。
🔧 技术专长: 在机器学习、搜索、广告、推荐、CV、NLP、多模态、数据分析等算法相关领域有丰富的项目实战经验。已累计为求职、科研、学习等需求提供近千次有偿|无偿定制化服务,助力多位小伙伴在学习、求职、工作上**少走弯路、提高效率,近一年好评率100% **。
📝 博客风采: 积极分享关于机器学习、深度学习、数据分析、NLP、PyTorch、Python、Linux、工作、项目总结相关的实用内容。
🌵文章目录🌵
下滑查看解决方法
🎯 1. 基本介绍
在PySpark中,数据可以以不同的文件格式存储,其中最常见的是TEXTFILE和PARQUET。这两种格式在存储效率、查询性能以及使用场景上有着显著的差异。
- STORED AS TEXTFILE:这是一种简单的存储方式,将数据以文本形式存储,通常用于非结构化数据。它不需要特定的序列化机制,易于阅读但不适合高效的数据查询。
- STORED AS PARQUET:Parquet是一种列式存储格式,被优化用于分析型查询。它支持复杂的嵌套数据结构,并且与Hadoop和Spark等大数据平台紧密集成。
💡 2. 代码使用
2.1 使用TEXTFILE存储格式
TEXTFILE存储格式是一种常见的文本文件存储格式,也是Hadoop中默认的文件存储格式之一。它是一种无压缩的存储格式,适合存储大规模的文本数据。
TEXTFILE存储格式将文本数据按行进行存储,每行数据都以换行符分隔。每一行可以是任何字符序列,可以是UTF-8编码的文本,也可以是二进制数据。不同的记录之间没有特定的分隔符或结构。这种存储格式的简单性使得它易于使用和处理。
- 使用TEXTFILE存储格式具有以下优点:
- 可读性好:由于存储的是明文文本,易于阅读和理解。
- 通用性强:可以存储各种类型的文本数据,包括纯文本、CSV格式、JSON格式等。
- 灵活性高:由于没有特定的分隔符或结构,可以自由定义记录的格式和解析方式。
- 适用性广泛:作为Hadoop默认的文件存储格式之一,可以方便地与Hadoop生态系统中的其他工具和组件集成使用。
- 但是,TEXTFILE存储格式也存在一些缺点:
- 占用存储空间大:由于文件没有经过压缩处理,所以存储空间较大。
- 读取性能较低:由于没有压缩和索引的支持,在大规模数据集上的读取性能相对较低。
- 不适合处理结构化数据:由于缺乏严格的分隔符和结构,相对不适合存储和处理结构化的数据。 具体的pyspark通过sparksession指定格式中的代码实践如下所示:
from pyspark.sql import SparkSession
# 创建SparkSession
spark = SparkSession.builder \
.appName("TEXTFILE vs PARQUET") \
.getOrCreate()# 创建一个DataFrame
df_text = spark.createDataFrame([(1,"Alice"),(2,"Bob")],["id","name"])# 写入TEXTFILE格式
df_text.write \
.option("header","true") \
.csv("path_to_output_textfile")# 输出结果:数据将被写入到指定路径的文本文件中
在创建表的时候指定格式,具体的代码如下所示:
CREATE TABLE IF NOT EXISTS my_table_name (
column1_name column1_datatype,
column2_name column2_datatype,...)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;-- 指定存储格式为TEXTFILE
2.2 使用PARQUET存储格式
PARQUET
存储格式是一种列式存储格式,常用于大规模数据存储和分析场景。它在存储和处理大规模结构化数据上具有很高的效率和性能。
`PARQUET存储格式将数据按列进行存储,而不是按行存储。每列的数据都以独立的文件进行存储,利用列内数据的相似性进行高效的压缩和编码。这种存储方式使得PARQUET能够提供更高的读取和查询性能,减少了数据的I/O开销,并且能够更好地利用系统内存和CPU资源。
- PARQUET存储格式具有以下特点和优势:
- 列式存储:按列存储数据,减少了存储空间和I/O开销,提高了读取和查询性能。
- 压缩效率高:PARQUET支持多种压缩算法,如Snappy、Gzip和LZO等,可以根据数- - 据特点选择最合适的压缩方式。
- 列压缩和编码:PARQUET采用了高效的列压缩和编码算法,对相同的数据进行重复压缩和编码,进一步减少存储空间。
- 谓词下推(Predicate Pushdown):PARQUET支持谓词下推操作,可以在查询执行之- 前通过元数据信息进行过滤,减少数据的扫描和读取量,提高查询效率。
- 列式统计信息:PARQUET存储格式可以在列级别上存储统计信息,如最大值、最小值、唯一值数量等,方便进行数据分析和查询优化。 具体的pyspark通过sparksession指定格式中的代码实践如下所示:
from pyspark.sql import SparkSession
# 创建SparkSession
spark = SparkSession.builder \
.appName("Create Table with Storage Format") \
.getOrCreate()# 创建DataFrame
df = spark.createDataFrame([(1,"Alice"),(2,"Bob")],["id","name"])# 使用Parquet格式创建表
df.write \
.saveAsTable("my_table_name",format="parquet")
在创建表的时候指定格式,具体的代码如下所示:
CREATE TABLE IF NOT EXISTS my_table_name (
column1_name column1_datatype,
column2_name column2_datatype,...)
STORED AS PARQUET;-- 指定存储格式为Parquet
🔍 3. 注意事项
- TEXTFILE格式适合于小规模数据或日志数据,而PARQUET格式适合于需要高效查询和分析的大规模数据集。
- Parquet文件是列式存储,可以显著提高查询性能,尤其是在数据倾斜或过滤操作中。
- Parquet格式支持数据压缩,可以有效减少存储空间。
- 在读取Parquet文件时,Spark可以利用列剪枝(Column Pruning)和谓词下推(Predicate Pushdown)来提高查询效率。
🔍 4. 总结
在PySpark中,选择正确的存储格式对于优化数据处理和查询性能至关重要。TEXTFILE格式简单易用,但只适合非结构化数据或小规模数据集。相比之下,PARQUET格式提供了高效的存储和查询能力,尤其适合于分析型工作负载。通过本博客的代码示例,我们学习了如何在PySpark中使用这两种存储格式,并理解了它们在不同场景下的应用。希望这篇博客能够帮助你更好地选择适合你数据需求的存储格式。
版权归原作者 算法驯化师 所有, 如有侵权,请联系我们删除。