pyarrow.ParquetDataset > 分区列的架构
Schema for pyarrow.ParquetDataset > partition columns
- 我有一个 pandas 数据框:
import pandas as pd
df = pd.DataFrame(data={"col1": [1, 2], "col2": [3.0, 4.0], "col3": ["foo", "bar"]})
- 使用s3fs:
from s3fs import S3FileSystem
s3fs = S3FileSystem(**kwargs)
- 我可以把它写成镶木地板数据集
import pyarrow as pa
import pyarrow.parquet as pq
tbl = pa.Table.from_pandas(df)
root_path = "../parquet_dataset/foo"
pq.write_to_dataset(
table=tbl,
root_path=root_path,
filesystem=s3fs,
partition_cols=["col3"],
partition_filename_cb=lambda _: "data.parquet",
)
- 稍后,我需要
pq.ParquetSchema
用于转储的 DataFrame。
import pyarrow as pa
import pyarrow.parquet as pq
dataset = pq.ParquetDataset(root_path, filesystem=s3fs)
schema = dataset.schema
但是 parquet 数据集 -> “模式”不包括分区 cols 模式。
如何获取分区列的架构?
我认为您需要 ParquetDataset
分区键架构的提示。
partition_schema = pa.schema([pa.field('col3', pa.string())])
partitioning = pa.dataset.partitioning(schema=partition_schema)
partitionaldataset = pq.ParquetDataset(
root_path,
partitioning=partitioning,
)
这给你这个架构:
col1: int64
col2: double
col3: string
PS:我无法完全重现您的示例(我无权访问 S3),我不得不在写入和读取数据集时添加 use_legacy_dataset=False
。
原来我必须显式转储“元数据”。
table = pa.Table.from_pandas(df)
pq.write_to_dataset(
table=table,
root_path=path,
filesystem=s3fs,
partition_cols=partition_cols,
partition_filename_cb=lambda _: "data.parquet",
)
# Write metadata-only Parquet file from schema
pq.write_metadata(
schema=table.schema, where=path + "/_common_metadata", filesystem=s3fs
)
文档https://arrow.apache.org/docs/python/parquet.html#writing-metadata-and-common-medata-files
我只关心“公共元数据”,但您可以转储行统计信息。
- 我有一个 pandas 数据框:
import pandas as pd
df = pd.DataFrame(data={"col1": [1, 2], "col2": [3.0, 4.0], "col3": ["foo", "bar"]})
- 使用s3fs:
from s3fs import S3FileSystem
s3fs = S3FileSystem(**kwargs)
- 我可以把它写成镶木地板数据集
import pyarrow as pa
import pyarrow.parquet as pq
tbl = pa.Table.from_pandas(df)
root_path = "../parquet_dataset/foo"
pq.write_to_dataset(
table=tbl,
root_path=root_path,
filesystem=s3fs,
partition_cols=["col3"],
partition_filename_cb=lambda _: "data.parquet",
)
- 稍后,我需要
pq.ParquetSchema
用于转储的 DataFrame。
import pyarrow as pa
import pyarrow.parquet as pq
dataset = pq.ParquetDataset(root_path, filesystem=s3fs)
schema = dataset.schema
但是 parquet 数据集 -> “模式”不包括分区 cols 模式。
如何获取分区列的架构?
我认为您需要 ParquetDataset
分区键架构的提示。
partition_schema = pa.schema([pa.field('col3', pa.string())])
partitioning = pa.dataset.partitioning(schema=partition_schema)
partitionaldataset = pq.ParquetDataset(
root_path,
partitioning=partitioning,
)
这给你这个架构:
col1: int64
col2: double
col3: string
PS:我无法完全重现您的示例(我无权访问 S3),我不得不在写入和读取数据集时添加 use_legacy_dataset=False
。
原来我必须显式转储“元数据”。
table = pa.Table.from_pandas(df)
pq.write_to_dataset(
table=table,
root_path=path,
filesystem=s3fs,
partition_cols=partition_cols,
partition_filename_cb=lambda _: "data.parquet",
)
# Write metadata-only Parquet file from schema
pq.write_metadata(
schema=table.schema, where=path + "/_common_metadata", filesystem=s3fs
)
文档https://arrow.apache.org/docs/python/parquet.html#writing-metadata-and-common-medata-files
我只关心“公共元数据”,但您可以转储行统计信息。