Skip to content
هذه الصفحة غير متوفرة بلغتك بعد. يتم عرض النسخة الإنجليزية.

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 के रूप में

yaml
output_annotation_dir: "output/"
output_annotation_format: "parquet"

Secondary Export के रूप में (JSON Primary रखें)

yaml
output_annotation_dir: "output/"
output_annotation_format: "jsonl"
 
parquet_export:
  enabled: true
  output_dir: "output/parquet/"
  auto_export: true              # export after each annotation session

CLI के माध्यम से On-Demand

bash
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।

ColumnTypeविवरण
instance_idstringInstance पहचानकर्ता
annotatorstringAnnotator username
schema_namestringAnnotation schema नाम
valuestringAnnotation value (complex types के लिए JSON-encoded)
timestamptimestampAnnotation कब बनाई गई
duration_msint64इस instance पर बिताया समय (milliseconds)
session_idstringAnnotation 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।

ColumnTypeविवरण
instance_idstringInstance पहचानकर्ता
annotatorstringAnnotator username
schema_namestringAnnotation schema नाम
span_idstringUnique span पहचानकर्ता
textstringSpan text content
start_offsetint32Character start offset
end_offsetint32Character end offset
labelstringSpan label
fieldstringSource field (multi-field span annotation के लिए)
linksstringJSON-encoded link data (span_link के लिए)
attributesstringJSON-encoded अतिरिक्त attributes

3. items.parquet

Dataset में प्रत्येक instance के बारे में metadata। प्रति instance एक row।

ColumnTypeविवरण
instance_idstringInstance पहचानकर्ता
textstringPrimary text content
annotation_countint32प्राप्त annotations की संख्या
annotatorsstringAnnotator usernames की JSON list
statusstringInstance status (pending, in_progress, complete)
metadatastringJSON-encoded instance metadata

Compression Options

yaml
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 optimization

Compression तुलना

AlgorithmCompression RatioWrite SpeedRead Speedसर्वश्रेष्ठ उपयोग
snappyModerateFastFastसामान्य उपयोग (default)
gzipHighSlowModerateArchival, छोटी files
zstdHighFastFastSize और speed का सर्वोत्तम संतुलन
lz4LowVery FastVery FastSpeed-critical workloads
brotliVery HighVery SlowModerateMaximum compression
noneNoneFastestFastestDebugging

अधिकांश annotation projects के लिए, default snappy compression एक अच्छा विकल्प है। बड़े datasets के लिए जहाँ file size मायने रखती है, zstd का उपयोग करें।

Parquet Data लोड करना

pandas

python
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

sql
-- 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

python
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

python
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

python
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 सक्षम करें:

yaml
parquet_export:
  enabled: true
  output_dir: "output/parquet/"
  incremental: true
  partition_by: date             # date, annotator, or none

partition_by: date के साथ, Parquet files date-partitioned directories में व्यवस्थित होती हैं:

text
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 के रूप में पढ़ा जा सकता है:

python
# pandas reads partitioned directories automatically
df = pd.read_parquet("output/parquet/annotations/")
 
# DuckDB handles partitions natively
# SELECT * FROM 'output/parquet/annotations/**/*.parquet'

कॉन्फ़िगरेशन Reference

yaml
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

पूर्ण उदाहरण

yaml
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: true

Annotation के बाद load और analyze करें:

python
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())

आगे पढ़ें

कार्यान्वयन विवरण के लिए, source documentation देखें।