用 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 相关文章推荐
Android分包MultiDex策略详解
Oct 30 Python
Python设计模式之门面模式简单示例
Jan 09 Python
TensorFlow saver指定变量的存取
Mar 10 Python
python实现简单登陆系统
Oct 18 Python
python dict 相同key 合并value的实例
Jan 21 Python
Python父目录、子目录的相互调用方法
Feb 16 Python
详解Python 定时框架 Apscheduler原理及安装过程
Jun 14 Python
Python绘制热力图示例
Sep 27 Python
python生成器用法实例详解
Nov 22 Python
postman和python mock测试过程图解
Feb 22 Python
Python装饰器实现方法及应用场景详解
Mar 26 Python
python中_del_还原数据的方法
Dec 09 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+mysql保存和输出文件
2006/10/09 PHP
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
PHP 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
PHP中iconv函数转码时截断字符问题的解决方法
2015/01/21 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
2012/12/11 Javascript
简单的JavaScript互斥锁分享
2014/02/02 Javascript
查询json的数据结构的8种方式简介
2014/03/10 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
2015/01/09 Javascript
javascript实现获取浏览器版本、操作系统类型
2015/01/29 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
2016/12/02 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
Linux Centos7.2下安装nodejs&amp;npm配置全局路径的教程
2018/05/15 NodeJs
jQuery/JS监听input输入框值变化实例
2019/10/17 jQuery
Python中decorator使用实例
2015/04/14 Python
Python基于百度AI的文字识别的示例
2018/04/21 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
漂亮的Django Markdown富文本app插件的实现
2019/01/02 Python
python实现视频分帧效果
2019/05/31 Python
Numpy将二维数组添加到空数组的实现
2019/12/05 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
Python 实现数组相减示例
2019/12/27 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
python之随机数函数的实现示例
2020/12/30 Python
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
协议书模板
2014/04/23 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
2015年安全保卫工作总结
2015/05/14 职场文书
辛亥革命观后感
2015/06/02 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书
为什么不建议在go项目中使用init()
2021/04/12 Golang
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis
win10识别不了U盘怎么办 win10系统读取U盘失败的解决办法
2022/08/05 数码科技