【Python笔记】Parquet介绍及简单使用

本文详细介绍了Apache Parquet,一种源于Google Dremel论文的列式存储格式,常用于大数据处理。Parquet特性包括:数据过滤、压缩编码和向量化运算。在Spark中,可以通过`load`和`save`函数读写Parquet文件,支持DataFrame的查询和转换。此外,文章还展示了如何将JSON数据转换为Parquet,以及通过JDBC读取关系型数据库数据和操作Hive表的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 什么是parquet

  • 定义:Parquet 是列式存储的一种文件类型
  • 官网描述:无论数据处理框架,数据模型或编程语言的选择如何,Apache Parquet都是Hadoop生态系统中任何项目可用的列式存储格式
  • 由来:Parquet的灵感来自于2010年Google发表的Dremel论文,文中介绍了一种支持嵌套结构的存储格式,并且使用了列式存储的方式提升查询性能,在Dremel论文中还介绍了Google如何使用这种存储格式实现并行查询的,如果对此感兴趣可以参考论文和开源实现Apache Drill。
  • 特点
    • 可以跳过不符合条件的数据,只读取需要的数据,降低 IO 数据量

    • 压缩编码可以降低磁盘存储空间(由于同一列的数据类型是一样的,可以使用更高效的压缩编码(如 Run Length Encoding t Delta Encoding)进一步节约存储空间)

    • 只读取需要的列,支持向量运算,能够获取更好的扫描性能

    • Parquet 格式是 Spark SQL 的默认数据源,可通过 spark.sql.sources.default 配置

2 parquet 常用操作

2.1 load 和 save 函数

// 读取 Parquet 文件
val usersDF = spark.read.load("/test/users.parquet")
 
// 查询 Schema 和数据
usersDF.printSchema
usersDF.show
 
// 查询用户的 name 和喜爱颜色并保存
usersDF.select($"name", $"favorite_color").write.save("/test/result/parquet")
// 验证结果 可通过 printSchema 查询数据结构,使用 show 查看数据

// 显式指定文件格式: 加载 json 格式
val usersDF = spark.read.format("json").load("/test/people.json")
 
// 存储模式(Save Modes)
// 可以采用 SaveMode 执行存储操作, SaveMode 定义了对数据的处理模式,需要注意的是,这些保存模式不使用任何锁定,不是原子操作
// 当使用 Overwrite 方式执行时,在输出新数据之前,原数据就已经被删除
usersDF.select($"name").write.save("/test/parquet1")   // 若 /test/parquet1 存在会报错
usersDF.select($"name").wirte.mode("overwrite").save("/test/parquet1") // 使用 overwrite 即可
 
// 将结果保存为表, 也可以进行分区,分桶等操作: partitionBy bucketBy
usersDF.select($"name").write.saveAsTable("table1")

2.2 Parquet文件

Parquet 是一个列格式而且用于多个数据处理系统中

Spark SQL 提供支持对于 Parquet 文件的读写,也就是自动保存原始 数据的 Schema, 当写 Parquet 文件时,所有的列被自动转化为 nullable,因为兼容性的缘故

  • 读取 Json 格式的数据,将其转换成 parquet 格式,创建相应的表,使用 SQL 语句查询
// 从 json 文件中读入数据
val empJson = spark.read.json("/test/emp.json")

// 将数据保存为 parquet
empJson.write.mode("overwrite").parquet("/test/parquet")

// 读取 parquet
val empParquet = spark.read.parquet("/test/parquet")

// 创建临时表 emptable
empParquet.createOrReplaceTempView("emptalbe")

// 使用 SQL 语句执行查询
spark.sql("select * from emptable where deptno=10 and sal>1500").show
  • Schematic 的合并: 先定义一个简单的 Schema,然后逐渐增加列描述,用户可以获取多个有多个不同 Schema 但相互兼容的Parquet 文件
// 创建第一个文件
val df1 = sc.makeRDD(1 to 5).map(x=> (x, x*2)).toDF("single", "double")
scala> df1.printSchema
root
 |-- single: integer (nullable = false)
 |-- double: integer (nullable = false)
  
  
// 创建第二个文件
 scala> val df2 = sc.makeRDD(6 to 10).map(x=> (x, x*2)).toDF("single", "triple")
df2: org.apache.spark.sql.DataFrame = [single: int, triple: int]
 
scala> df2.printSchema
root
 |-- single: integer (nullable = false)
 |-- triple: integer (nullable = false)
   
 scala> df2.write.parquet("/data/testtable/key=2")
 
 // 合并上面的两个文件
scala> val df3 = spark.read.option("mergeSchema", "true").parquet("/data/testtable")
df3: org.apache.spark.sql.DataFrame = [single: int, double: int ... 2 more fields]
 
scala> df3.printSchema
root
 |-- single: integer (nullable = true)
 |-- double: integer (nullable = true)
 |-- triple: integer (nullable = true)
 |-- key: integer (nullable = true)
  
 scala> df3.show
+------+------+------+---+
|single|double|triple|key|
+------+------+------+---+
|     8|  null|    16|  2|
|     9|  null|    18|  2|
|    10|  null|    20|  2|
|     3|     6|  null|  1|
|     4|     8|  null|  1|
|     5|    10|  null|  1|
|     6|  null|    12|  2|
|     7|  null|    14|  2|
|     1|     2|  null|  1|
|     2|     4|  null|  1|
+------+------+------+---+

2.3 Json Datasets(两种写法)

// 第一种
scala> val df4 = spark.read.json("/app/spark-2.2.1-bin-hadoop2.7/examples/src/main/resources/people.json")
df4: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
 
scala> df4.show
+----+-------+
| age|   name|
+----+-------+
|null|Michael|
|  30|   Andy|
|  19| Justin|
+----+-------+
 
// 第二种
scala> val df5 = spark.read.format("json").load("/app/spark-2.2.1-bin-hadoop2.7/examples/src/main/resources/people.json")
df5: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
 
scala> df5.show
+----+-------+
| age|   name|
+----+-------+
|null|Michael|
|  30|   Andy|
|  19| Justin|
+----+-------+

2.4 JDBC 方式读取关系型数据库中的数据(需要将 JDBC 的驱动加入)

// 将 JDBC 的驱动加入
bin/spark-shell --master spark://bigdata11:7077 --jars /root/temp/ojdbc6.jar --driver-class-path /root/temp/ojdbc6.jar
 
// 读取 Oracle
val oracleEmp = spark.read.format("jdbc")
                    .option("url","jdbc:oracle:thin:@192.168.10.100:1521/orcl.example.com")
                    .option("dbtable","scott.emp")
                    .option("user","scott")
                    .option("password","tiger").load

2.5 操作 Hive 的表

  • 把 hive 和 hadoop 的配置文件拷贝到sprke 的 conf 目录下:hive-sit.xml, core-sit.xml, hdfs-sit.xml
  • 启动 Spark-shell 时 指定mysql 数据库的驱动程序
./bin/spark-shell --master spark://bigdata0:7077 --jars /data/tools/mysql-connector-java-5.1.43-bin.jar  --driver-class-path /data/tools/mysql-connector-java-5.1.43-bin.jar
  • 使用 Spark Shell 操作 Hive
// 创建表
spark.sql("create table ccc(key INT, value STRING) row format delimited fields terminated by ','")
 
// 导入数据
spark.sql("load data local path '/test/data.txt' into table ccc")
 
// 查询数据
spark.sql("select * from ccc").show
  • 使用 Spark SQL 操作 Hive
show tables;
select * from ccc;
Parquet 文件是一种高效的列式存储文件格式,广泛应用于大数据处理领域。为了方便分析和理解 Parquet 文件内容,有多种可视化工具可以帮助用户直观地查看其中的数据。以下是几种常见的 Parquet 可视化工具: 1. **DBeaver** - DBeaver 是一个多数据库管理工具,支持读取和显示各种类型的数据库表以及文件系统中的表格数据,包括 Parquet 文件。它不仅允许您直接打开本地或远程服务器上的 Parquet 文件,还可以通过 SQL 查询进一步筛选、过滤及聚合数据。 2. **Apache Zeppelin** - Apache Zeppelin 是一个基于 Web 的笔记本环境,专为数据分析和协作设计。它可以轻松加载来自 HDFS 或本地磁盘的 Parquet 文件,并利用内置的各种图表库将结果呈现出来。此外,Zeppelin 还能与其他 Big Data 生态系统的组件无缝集成,如 Spark 等。 3. **Pandas + Jupyter Notebook** - 如果你熟悉 Python 编程语言,则可以结合 Pandas 库与 Jupyter Notebook 来实现对 Parquet 文件的有效解析和可视化。首先使用 PyArrow 或 Fastparquet 解析器从 .parquet 文件中提取出 DataFrame 格式的结构化数据;然后借助 Matplotlib 或 Seaborn 等绘图包生成所需的图形展示效果。 4. **Tableau** - Tableau 支持原生导入 Parquet 文件作为数据源之一,在强大的拖拽界面下快速构建交互式报表和仪表板,非常适合业务分析师和技术人员共同合作完成复杂的数据洞察项目。 以上就是关于 Parquet 文件可视化的常用工具介绍。希望这些建议对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值