用 Python 定义 Schema 并生成 Parquet 文件详情
Java
和Python
实现 Avro 转换成Parquet
格式,chema
都是在 Avro 中定义的。这里要尝试的是如何定义Parquet
的Schema
, 然后据此填充数据并生成Parquet
文件。
一、简单字段定义
1、定义 Schema 并生成 Parquet 文件
import pandas as pd import pyarrow as pa import pyarrow.parquet as pq # 定义 Schema schema = pa.schema([ ('id', pa.int32()), ('email', pa.string()) ]) # 准备数据 ids = pa.array([1, 2], type = pa.int32()) emails = pa.array(['first@example.com', 'second@example.com'], pa.string()) # 生成 Parquet 数据 batch = pa.RecordBatch.from_arrays( [ids, emails], schema = schema ) table = pa.Table.from_batches([batch]) # 写 Parquet 文件 plain.parquet pq.write_table(table, 'plain.parquet') import pandas as pd import pyarrow as pa import pyarrow . parquet as pq # 定义 Schema schema = pa . schema ( [ ( 'id' , pa . int32 ( ) ) , ( 'email' , pa . string ( ) ) ] ) # 准备数据 ids = pa . array ( [ 1 , 2 ] , type = pa . int32 ( ) ) emails = pa . array ( [ 'first@example.com' , 'second@example.com' ] , pa . string ( ) ) # 生成 Parquet 数据 batch = pa . RecordBatch . from_arrays ( [ ids , emails ] , schema = schema ) table = pa . Table . from_batches ( [ batch ] ) # 写 Parquet 文件 plain.parquet pq . write_table ( table , 'plain.parquet' )
2、验证 Parquet 数据文件
我们可以用工具 parquet-tools
来查看 plain.parquet
文件的数据和 Schema
$ parquet-tools schema plain.parquet message schema { optional int32 id; optional binary email (STRING); } $ parquet-tools cat --json plain.parquet {"id":1,"email":"first@example.com"} {"id":2,"email":"second@example.com"}
没问题,与我们期望的一致。也可以用 pyarrow
代码来获取其中的 Schema
和数据
schema = pq.read_schema('plain.parquet') print(schema) df = pd.read_parquet('plain.parquet') print(df.to_json()) schema = pq . read_schema ( 'plain.parquet' ) print ( schema ) df = pd . read_parquet ( 'plain.parquet' ) print ( df . to_json ( ) )
输出为:
schema = pq.read_schema('plain.parquet') print(schema) df = pd.read_parquet('plain.parquet') print(df.to_json()) schema = pq . read_schema ( 'plain.parquet' ) print ( schema ) df = pd . read_parquet ( 'plain.parquet' ) print ( df . to_json ( ) )
二、含嵌套字段定义
下面的 Schema
定义加入一个嵌套对象,在 address
下分 email_address
和 post_address
,Schema
定义及生成 Parquet
文件的代码如下
import pandas as pd import pyarrow as pa import pyarrow.parquet as pq # 内部字段 address_fields = [ ('email_address', pa.string()), ('post_address', pa.string()), ] # 定义 Parquet Schema,address 嵌套了 address_fields schema = pa.schema(j) # 准备数据 ids = pa.array([1, 2], type = pa.int32()) addresses = pa.array( [('first@example.com', 'city1'), ('second@example.com', 'city2')], pa.struct(address_fields) ) # 生成 Parquet 数据 batch = pa.RecordBatch.from_arrays( [ids, addresses], schema = schema ) table = pa.Table.from_batches([batch]) # 写 Parquet 数据到文件 pq.write_table(table, 'nested.parquet') import pandas as pd import pyarrow as pa import pyarrow . parquet as pq # 内部字段 address_fields = [ ( 'email_address' , pa . string ( ) ) , ( 'post_address' , pa . string ( ) ) , ] # 定义 Parquet Schema,address 嵌套了 address_fields schema = pa . schema ( j ) # 准备数据 ids = pa . array ( [ 1 , 2 ] , type = pa . int32 ( ) ) addresses = pa . array ( [ ( 'first@example.com' , 'city1' ) , ( 'second@example.com' , 'city2' ) ] , pa . struct ( address_fields ) ) # 生成 Parquet 数据 batch = pa . RecordBatch . from_arrays ( [ ids , addresses ] , schema = schema ) table = pa . Table . from_batches ( [ batch ] ) # 写 Parquet 数据到文件 pq . write_table ( table , 'nested.parquet' )
1、验证 Parquet 数据文件
同样用 parquet-tools
来查看下 nested.parquet
文件
$ parquet-tools schema nested.parquet message schema { optional int32 id; optional group address { optional binary email_address (STRING); optional binary post_address (STRING); } } $ parquet-tools cat --json nested.parquet {"id":1,"address":{"email_address":"first@example.com","post_address":"city1"}} {"id":2,"address":{"email_address":"second@example.com","post_address":"city2"}}
用 parquet-tools
看到的 Schama
并没有 struct
的字样,但体现了它 address
与下级属性的嵌套关系。
用 pyarrow
代码来读取 nested.parquet
文件的 Schema
和数据是什么样子
schema = pq.read_schema("nested.parquet") print(schema) df = pd.read_parquet('nested.parquet') print(df.to_json()) schema = pq . read_schema ( "nested.parquet" ) print ( schema ) df = pd . read_parquet ( 'nested.parquet' ) print ( df . to_json ( ) )
输出:
id: int32 -- field metadata -- PARQUET:field_id: '1' address: struct<email_address: string, post_address: string> child 0, email_address: string -- field metadata -- PARQUET:field_id: '3' child 1, post_address: string -- field metadata -- PARQUET:field_id: '4' -- field metadata -- PARQUET:field_id: '2' {"id":{"0":1,"1":2},"address":{"0":{"email_address":"first@example.com","post_address":"city1"},"1":{"email_address":"second@example.com","post_address":"city2"}}} id : int32 -- field metadata -- PARQUET : field_id : '1' address : struct & lt ; email_address : string , post_address : string & gt ; child 0 , email_address : string -- field metadata -- PARQUET : field_id : '3' child 1 , post_address : string -- field metadata -- PARQUET : field_id : '4' -- field metadata -- PARQUET : field_id : '2' { "id" : { "0" : 1 , "1" : 2 } , "address" : { "0" : { "email_address" : "first@example.com" , "post_address" : "city1" } , "1" : { "email_address" : "second@example.com" , "post_address" : "city2" } } }
数据当然是一样的,有略微不同的是显示的 Schema
中, address
标识为 struct<email_address: string, post_address: string>
, 明确的表明它是一个 struct
类型,而不是只展示嵌套层次。
到此这篇关于用 Python
定义 Schema
并生成 Parquet
文件详情的文章就介绍到这了,更多相关用 Python
定义 Schema
并生成 Parquet
文件内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
- 这篇文章主要介绍了python-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
- 下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08Jupyter Notebook读取csv文件出现的问题及解决
这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06- 2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
- 在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
python-for x in range的用法(注意要点、细节)
这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
- 有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
python Matplotlib基础--如何添加文本和标注
这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26- C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
- 今天小编就为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
php无刷新利用iframe实现页面无刷新上传文件(1/2)
利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25- 这篇文章主要为大家详细介绍了python实现双色球随机选号,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-05-02
- 在本篇文章里小编给大家整理的是一篇关于python中使用np.delete()的实例方法,对此有兴趣的朋友们可以学习参考下。...2021-02-01