用 Python 定義 Schema 并生成 Parquet 文件詳情
Java和Python實(shí)現(xiàn) Avro 轉(zhuǎn)換成Parquet格式,chema都是在 Avro 中定義的。這里要嘗試的是如何定義Parquet的Schema, 然后據(jù)此填充數(shù)據(jù)并生成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())
])
# 準(zhǔn)備數(shù)據(jù)
ids = pa.array([1, 2], type = pa.int32())
emails = pa.array(['first@example.com', 'second@example.com'], pa.string())
# 生成 Parquet 數(shù)據(jù)
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 ( ) )
] )
# 準(zhǔn)備數(shù)據(jù)
ids = pa . array ( [ 1 , 2 ] , type = pa . int32 ( ) )
emails = pa . array ( [ 'first@example.com' , 'second@example.com' ] , pa . string ( ) )
# 生成 Parquet 數(shù)據(jù)
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、驗(yàn)證 Parquet 數(shù)據(jù)文件
我們可以用工具 parquet-tools 來查看 plain.parquet 文件的數(shù)據(jù)和 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 和數(shù)據(jù)
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 定義加入一個(gè)嵌套對(duì)象,在 address 下分 email_address 和 post_address,Schema 定義及生成 Parquet 文件的代碼如下
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq
# 內(nèi)部字段
address_fields = [
('email_address', pa.string()),
('post_address', pa.string()),
]
# 定義 Parquet Schema,address 嵌套了 address_fields
schema = pa.schema(j)
# 準(zhǔn)備數(shù)據(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 數(shù)據(jù)
batch = pa.RecordBatch.from_arrays(
[ids, addresses],
schema = schema
)
table = pa.Table.from_batches([batch])
# 寫 Parquet 數(shù)據(jù)到文件
pq.write_table(table, 'nested.parquet')
import pandas as pd
import pyarrow as pa
import pyarrow . parquet as pq
# 內(nèi)部字段
address_fields = [
( 'email_address' , pa . string ( ) ) ,
( 'post_address' , pa . string ( ) ) ,
]
# 定義 Parquet Schema,address 嵌套了 address_fields
schema = pa . schema ( j )
# 準(zhǔn)備數(shù)據(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 數(shù)據(jù)
batch = pa . RecordBatch . from_arrays (
[ ids , addresses ] ,
schema = schema
)
table = pa . Table . from_batches ( [ batch ] )
# 寫 Parquet 數(shù)據(jù)到文件
pq . write_table ( table , 'nested.parquet' )
1、驗(yàn)證 Parquet 數(shù)據(jù)文件
同樣用 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 的字樣,但體現(xiàn)了它 address 與下級(jí)屬性的嵌套關(guān)系。
用 pyarrow 代碼來讀取 nested.parquet 文件的 Schema 和數(shù)據(jù)是什么樣子
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" } } }
數(shù)據(jù)當(dāng)然是一樣的,有略微不同的是顯示的 Schema 中, address 標(biāo)識(shí)為 struct<email_address: string, post_address: string> , 明確的表明它是一個(gè) struct 類型,而不是只展示嵌套層次。
到此這篇關(guān)于用 Python 定義 Schema 并生成 Parquet 文件詳情的文章就介紹到這了,更多相關(guān)用 Python 定義 Schema 并生成 Parquet 文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)三階魔方還原的示例代碼
這篇文章主要介紹了python實(shí)現(xiàn)三階魔方還原的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
將 Ubuntu 16 和 18 上的 python 升級(jí)到最新 python3.8 的方法教程
這篇文章主要介紹了如何將 Ubuntu 16 和 18 上的 python 升級(jí)到最新 3.8 版,本文通過實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Python使用pyecharts繪制世界地圖,省級(jí)地圖,城市地圖實(shí)例詳解
這篇文章主要介紹了如何使用Python中的pyecharts庫繪制世界地圖、中國地圖、省級(jí)地圖、市級(jí)地圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試2022-02-02
python獲取外網(wǎng)ip地址的方法總結(jié)
這篇文章主要介紹了python獲取外網(wǎng)ip地址的方法,實(shí)例總結(jié)了四種常用的獲取外網(wǎng)IP地址的技巧,需要的朋友可以參考下2015-07-07
python實(shí)現(xiàn)微秒級(jí)等待問題(windows)
這篇文章主要介紹了python實(shí)現(xiàn)微秒級(jí)等待問題(windows),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06

