Parquet Export
कुशल large-scale data processing के लिए annotations को Apache Parquet format में export करें।
Parquet Export
v2.3.0 में नया
Apache Parquet एक columnar storage format है जो analytical workloads के लिए अनुकूलित है। यह बड़े annotation datasets के लिए JSON और CSV पर महत्वपूर्ण लाभ प्रदान करता है: छोटे file sizes (आमतौर पर 5-10x compression), column-subset queries के लिए तेज़ reads, और लगभग हर data science tool (pandas, DuckDB, PyArrow, Spark, Polars, Hugging Face Datasets) में native support।
Potato annotations को सीधे Parquet format में export कर सकता है, तीन structured files उत्पन्न करते हुए जो सभी annotation types को cover करती हैं।
Parquet Export सक्षम करना
Primary Output Format के रूप में
output_annotation_dir: "output/"
output_annotation_format: "parquet"Secondary Export के रूप में (JSON Primary रखें)
output_annotation_dir: "output/"
output_annotation_format: "jsonl"
parquet_export:
enabled: true
output_dir: "output/parquet/"
auto_export: true # export after each annotation sessionCLI के माध्यम से On-Demand
python -m potato.export parquet --config config.yaml --output ./parquet_output/Output Files
Parquet export तीन files उत्पन्न करता है, प्रत्येक annotation data के एक अलग स्तर का प्रतिनिधित्व करती है।
1. annotations.parquet
Primary output file। प्रति (instance, annotator, schema) combination एक row।
| Column | Type | विवरण |
|---|---|---|
instance_id | string | Instance पहचानकर्ता |
annotator | string | Annotator username |
schema_name | string | Annotation schema नाम |
value | string | Annotation value (complex types के लिए JSON-encoded) |
timestamp | timestamp | Annotation कब बनाई गई |
duration_ms | int64 | इस instance पर बिताया समय (milliseconds) |
session_id | string | Annotation session पहचानकर्ता |
Simple annotation types (radio, likert, text) के लिए, value में raw value होता है। Complex types (multiselect, spans, events) के लिए, value में JSON string होता है।
2. spans.parquet
Span-based annotation types (span, span_link, event_annotation, coreference) के लिए। प्रति annotated span एक row।
| Column | Type | विवरण |
|---|---|---|
instance_id | string | Instance पहचानकर्ता |
annotator | string | Annotator username |
schema_name | string | Annotation schema नाम |
span_id | string | Unique span पहचानकर्ता |
text | string | Span text content |
start_offset | int32 | Character start offset |
end_offset | int32 | Character end offset |
label | string | Span label |
field | string | Source field (multi-field span annotation के लिए) |
links | string | JSON-encoded link data (span_link के लिए) |
attributes | string | JSON-encoded अतिरिक्त attributes |
3. items.parquet
Dataset में प्रत्येक instance के बारे में metadata। प्रति instance एक row।
| Column | Type | विवरण |
|---|---|---|
instance_id | string | Instance पहचानकर्ता |
text | string | Primary text content |
annotation_count | int32 | प्राप्त annotations की संख्या |
annotators | string | Annotator usernames की JSON list |
status | string | Instance status (pending, in_progress, complete) |
metadata | string | JSON-encoded instance metadata |
Compression Options
parquet_export:
enabled: true
output_dir: "output/parquet/"
compression: snappy # snappy (default), gzip, zstd, lz4, brotli, none
row_group_size: 50000 # rows per row group (affects read performance)
use_dictionary: true # dictionary encoding for string columns
write_statistics: true # column statistics for query optimizationCompression तुलना
| Algorithm | Compression Ratio | Write Speed | Read Speed | सर्वश्रेष्ठ उपयोग |
|---|---|---|---|---|
snappy | Moderate | Fast | Fast | सामान्य उपयोग (default) |
gzip | High | Slow | Moderate | Archival, छोटी files |
zstd | High | Fast | Fast | Size और speed का सर्वोत्तम संतुलन |
lz4 | Low | Very Fast | Very Fast | Speed-critical workloads |
brotli | Very High | Very Slow | Moderate | Maximum compression |
none | None | Fastest | Fastest | Debugging |
अधिकांश annotation projects के लिए, default snappy compression एक अच्छा विकल्प है। बड़े datasets के लिए जहाँ file size मायने रखती है, zstd का उपयोग करें।
Parquet Data लोड करना
pandas
import pandas as pd
annotations = pd.read_parquet("output/parquet/annotations.parquet")
spans = pd.read_parquet("output/parquet/spans.parquet")
items = pd.read_parquet("output/parquet/items.parquet")
# Filter to a specific schema
sentiment = annotations[annotations["schema_name"] == "sentiment"]
# Compute inter-annotator agreement
from sklearn.metrics import cohen_kappa_score
pivot = sentiment.pivot(index="instance_id", columns="annotator", values="value")
kappa = cohen_kappa_score(pivot.iloc[:, 0], pivot.iloc[:, 1])DuckDB
-- Direct query without loading into memory
SELECT instance_id, value, COUNT(*) as annotator_count
FROM 'output/parquet/annotations.parquet'
WHERE schema_name = 'sentiment'
GROUP BY instance_id, value
ORDER BY annotator_count DESC;
-- Join annotations with items
SELECT a.instance_id, i.text, a.value, a.annotator
FROM 'output/parquet/annotations.parquet' a
JOIN 'output/parquet/items.parquet' i
ON a.instance_id = i.instance_id
WHERE a.schema_name = 'sentiment';PyArrow
import pyarrow.parquet as pq
# Read specific columns only (fast for wide tables)
table = pq.read_table(
"output/parquet/annotations.parquet",
columns=["instance_id", "value", "annotator"]
)
# Convert to pandas
df = table.to_pandas()
# Read with row group filtering
parquet_file = pq.ParquetFile("output/parquet/annotations.parquet")
print(f"Row groups: {parquet_file.metadata.num_row_groups}")
print(f"Total rows: {parquet_file.metadata.num_rows}")Hugging Face Datasets
from datasets import load_dataset
# Load directly from Parquet files
dataset = load_dataset("parquet", data_files={
"annotations": "output/parquet/annotations.parquet",
"spans": "output/parquet/spans.parquet",
"items": "output/parquet/items.parquet",
})
# Access as a regular HF dataset
print(dataset["annotations"][0])
# Push to Hugging Face Hub
dataset["annotations"].push_to_hub("my-org/my-annotations", split="train")Polars
import polars as pl
annotations = pl.read_parquet("output/parquet/annotations.parquet")
# Fast aggregation
label_counts = (
annotations
.filter(pl.col("schema_name") == "sentiment")
.group_by("value")
.agg(pl.count().alias("count"))
.sort("count", descending=True)
)
print(label_counts)Incremental Export
Long-running annotation projects के लिए, हर बार पूरे dataset को re-export करने से बचने के लिए incremental export सक्षम करें:
parquet_export:
enabled: true
output_dir: "output/parquet/"
incremental: true
partition_by: date # date, annotator, or nonepartition_by: date के साथ, Parquet files date-partitioned directories में व्यवस्थित होती हैं:
output/parquet/
annotations/
date=2026-03-01/part-0.parquet
date=2026-03-02/part-0.parquet
date=2026-03-03/part-0.parquet
spans/
date=2026-03-01/part-0.parquet
items/
part-0.parquet
Partitioned datasets को सभी प्रमुख tools द्वारा एक single logical table के रूप में पढ़ा जा सकता है:
# pandas reads partitioned directories automatically
df = pd.read_parquet("output/parquet/annotations/")
# DuckDB handles partitions natively
# SELECT * FROM 'output/parquet/annotations/**/*.parquet'कॉन्फ़िगरेशन Reference
parquet_export:
enabled: true
output_dir: "output/parquet/"
# When to export
auto_export: true # export after each session (default: false)
export_on_shutdown: true # export when server stops (default: true)
# File settings
compression: snappy
row_group_size: 50000
use_dictionary: true
write_statistics: true
# Incremental settings
incremental: false
partition_by: none # none, date, annotator
# Schema-specific options
flatten_complex_types: false # flatten JSON values into columns
include_raw_json: true # include raw JSON alongside flattened columns
# Span export
export_spans: true # generate spans.parquet
export_items: true # generate items.parquetपूर्ण उदाहरण
task_name: "NER Annotation Project"
task_dir: "."
data_files:
- "data/documents.jsonl"
item_properties:
id_key: doc_id
text_key: text
annotation_schemes:
- annotation_type: span
name: entities
labels:
- name: PERSON
color: "#3b82f6"
- name: ORGANIZATION
color: "#22c55e"
- name: LOCATION
color: "#f59e0b"
output_annotation_dir: "output/"
output_annotation_format: "jsonl"
parquet_export:
enabled: true
output_dir: "output/parquet/"
compression: zstd
auto_export: true
export_spans: true
export_items: trueAnnotation के बाद load और analyze करें:
import pandas as pd
spans = pd.read_parquet("output/parquet/spans.parquet")
# Entity type distribution
print(spans["label"].value_counts())
# Average span length by type
spans["length"] = spans["end_offset"] - spans["start_offset"]
print(spans.groupby("label")["length"].mean())आगे पढ़ें
- Export Formats -- COCO, YOLO, CoNLL, और अन्य export formats
- Remote Data Sources -- cloud storage से data loading
- Admin Dashboard -- export status की निगरानी
कार्यान्वयन विवरण के लिए, source documentation देखें।