用 Python 定义 Schema 并生成 Parquet 文件详情


Posted in Python onSeptember 25, 2021

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_addressSchema 定义及生成 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 相关文章推荐
Python面向对象之继承代码详解
Jan 29 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
Feb 21 Python
Python 实现一行输入多个值的方法
Apr 21 Python
对Python捕获控制台输出流的方法详解
Jan 07 Python
django-allauth入门学习和使用详解
Jul 03 Python
Python使用lambda表达式对字典排序操作示例
Jul 25 Python
python中append实例用法总结
Jul 30 Python
基于python 微信小程序之获取已存在模板消息列表
Aug 05 Python
python爬虫-模拟微博登录功能
Sep 12 Python
Jupyter notebook 远程配置及SSL加密教程
Apr 14 Python
python打包生成so文件的实现
Oct 30 Python
python中if嵌套命令实例讲解
Feb 25 Python
使用pipenv管理python虚拟环境的全过程
Sep 25 #Python
Django实现WebSocket在线聊天室功能(channels库)
Sep 25 #Python
Python天气语音播报小助手
用python基于appium模块开发一个自动收取能量的小助手
Python实现打乒乓小游戏
Python 类,对象,数据分类,函数参数传递详解
Sep 25 #Python
Python实现简单的俄罗斯方块游戏
You might like
解析php做推送服务端实现ios消息推送
2013/07/01 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
Symfony页面的基本创建实例详解
2015/01/26 PHP
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
Javascript 判断函数类型完美解决方案
2009/09/02 Javascript
javascript 得到变量类型的函数
2010/05/19 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
2010/05/25 Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
2013/01/11 Javascript
拖动table标题实现改变td的大小(css+js代码)
2013/04/16 Javascript
为jQuery添加Webkit的触摸的方法分享
2014/02/02 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
jQuery实现时尚漂亮的弹出式对话框实例
2015/08/07 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
全面介绍javascript实用技巧及单竖杠
2016/07/18 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
轻松理解Javascript变量的相关问题
2017/01/20 Javascript
NodeJS处理Express中异步错误
2017/03/26 NodeJs
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
Vue下滚动到页面底部无限加载数据的示例代码
2018/04/22 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
详解elementui之el-image-viewer(图片查看器)
2019/08/30 Javascript
python实现调用其他python脚本的方法
2014/10/05 Python
Python中 map()函数的用法详解
2018/07/10 Python
Python实现计算字符串中出现次数最多的字符示例
2019/01/21 Python
Python测试模块doctest使用解析
2019/08/10 Python
基于python plotly交互式图表大全
2019/12/07 Python
CSS3的一个简单导航栏实现
2015/08/03 HTML / CSS
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
幼儿教师自我鉴定
2013/11/02 职场文书
拓展培训心得体会
2014/01/04 职场文书
感恩老师演讲稿600字
2014/08/28 职场文书
老公保证书
2015/01/17 职场文书
Nginx配置https原理及实现过程详解
2021/03/31 Servers
浅谈pytorch中的dropout的概率p
2021/05/27 Python