Hub documentation
PyArrow
PyArrow
Arrow هو تنسيق أعمدي وأدوات لصياغة البيانات السريعة والتحليلات في الذاكرة.
بما أن PyArrow يدعم fsspec لقراءة البيانات عن بُعد وكتابتها، يمكنك استخدام مسارات Hugging Face (hf://) لقراءة البيانات على Hub وكتابتها.
وهو مفيد بشكل خاص لبيانات Parquet، لأن Parquet هو أكثر تنسيق ملفات شيوعًا على Hugging Face.
في الواقع، Parquet فعّال بشكل خاص بفضل بنيته وأنواعه وبياناته الوصفية وضغطه.
تحميل جدول
يمكنك تحميل البيانات من ملفات محلية أو من تخزين عن بُعد مثل Hugging Face Datasets. يدعم PyArrow العديد من الصيغ بما في ذلك CSV وJSON والأهم من ذلك Parquet:
>>> import pyarrow.parquet as pq
>>> table = pq.read_table("path/to/data.parquet")لتحميل ملف من Hugging Face، يجب أن يبدأ المسار بـ hf://. على سبيل المثال، المسار إلى مستودع مجموعة البيانات stanfordnlp/imdb هو hf://datasets/stanfordnlp/imdb. تحتوي مجموعة البيانات على Hugging Face على ملفات Parquet متعددة. صُمم تنسيق ملف Parquet لجعل قراءة بيانات الإطارات وكتابتها فعّالة، ولتسهيل مشاركة البيانات عبر لغات تحليل البيانات. فيما يلي كيفية تحميل الملف plain_text/train-00000-of-00001.parquet كجدول pyarrow (يتطلب pyarrow>=21.0):
>>> import pyarrow.parquet as pq
>>> table = pq.read_table("hf://datasets/stanfordnlp/imdb/plain_text/train-00000-of-00001.parquet")
>>> table
pyarrow.Table
text: string
label: int64
----
text: [["I rented I AM CURIOUS-YELLOW from my video store because of all the controversy that surrounded it (... 1542 chars omitted)", ...],...,[..., "The story centers around Barry McKenzie who must go to England if he wishes to claim his inheritan (... 221 chars omitted)"]]
label: [[0,0,0,0,0,...,0,0,0,0,0],...,[1,1,1,1,1,...,1,1,1,1,1]]إذا كنت لا ترغب في تحميل بيانات Parquet كاملة، يمكنك بدلاً من ذلك الحصول على بيانات Parquet الوصفية أو تحميل مجموعة صفوف تلو الأخرى:
>>> import pyarrow.parquet as pq
>>> pf = pq.ParquetFile("hf://datasets/stanfordnlp/imdb/plain_text/train-00000-of-00001.parquet")
>>> pf.metadata
<pyarrow._parquet.FileMetaData object at 0x1171b4090>
created_by: parquet-cpp-arrow version 12.0.0
num_columns: 2
num_rows: 25000
num_row_groups: 25
format_version: 2.6
serialized_size: 62036
>>> for i in pf.num_row_groups:
... table = pf.read_row_group(i)
... ...لمزيد من المعلومات حول مسارات Hugging Face وكيفية تنفيذها، يُرجى الرجوع إلى توثيق مكتبة العميل الخاصة بـ HfFileSystem.
حفظ جدول
يمكنك حفظ جدول pyarrow باستخدام pyarrow.parquet.write_table في ملف محلي أو مباشرةً على Hugging Face.
لحفظ الجدول على Hugging Face، تحتاج أولاً إلى تسجيل الدخول بحساب Hugging Face الخاص بك، على سبيل المثال باستخدام:
hf auth loginثم يمكنك إنشاء مستودع مجموعة بيانات، على سبيل المثال باستخدام:
from huggingface_hub import HfApi
HfApi().create_repo(repo_id="username/my_dataset", repo_type="dataset")أخيرًا، يمكنك استخدام مسارات Hugging Face في PyArrow:
import pyarrow.parquet as pq
pq.write_table(table, "hf://datasets/username/my_dataset/imdb.parquet", use_content_defined_chunking=True)
# or write in separate files if the dataset has train/validation/test splits
pq.write_table(table_train, "hf://datasets/username/my_dataset/train.parquet", use_content_defined_chunking=True)
pq.write_table(table_valid, "hf://datasets/username/my_dataset/validation.parquet", use_content_defined_chunking=True)
pq.write_table(table_test , "hf://datasets/username/my_dataset/test.parquet", use_content_defined_chunking=True)لاحظ أن ملفات Parquet على Hugging Face مُحسَّنة لتحسين كفاءة التخزين، وتسريع عمليات التنزيل والرفع، وتمكين بثّ مجموعات البيانات وتحريرها بكفاءة:
- يحسّن Parquet Content Defined Chunking ملفات Parquet من أجل Xet، وهو نظام تخزين Hugging Face. فهو يسرّع عمليات الرفع والتنزيل بفضل إزالة التكرار على أساس المقاطع، ويتيح تحرير الملفات بكفاءة
- يسرّع فهرس الصفحة عمليات التصفية أثناء البث المباشر ويتيح وصولاً عشوائياً فعالاً، على سبيل المثال في عارض مجموعة البيانات
يتطلب PyArrow حِجَاجًا إضافيةً لكتابة ملفات Parquet مُحسَّنة:
import pyarrow.parquet as pq
pq.write_table(
table,
"hf://datasets/username/my_dataset/imdb.parquet",
# Optimize for Xet
use_content_defined_chunking=True,
write_page_index=True,
)use_content_defined_chunking=Trueلتفعيل Parquet Content Defined Chunking، من أجل إزالة التكرار و التحرير (يتطلبpyarrow>=21.0)write_page_index=Trueلتضمين فهرس الصفحات في بيانات Parquet الوصفية، من أجل التدفق والوصول العشوائي
تتيح تقسيمات المحتوى المُعرَّفة (CDC) لبرنامج Parquet writer تقسيم صفحات البيانات بطريقة تجعل البيانات المكررة تُقسَّم وتُضغط بشكل متطابق. بدون CDC، تُقسَّم الصفحات بشكل عشوائي، وبالتالي يصبح من المستحيل اكتشاف البيانات المكررة بسبب الضغط. بفضل CDC، تصبح عمليات رفع وتنزيل Parquet من Hugging Face أسرع، حيث تُرفع أو تُنزَّل البيانات المكررة مرة واحدة فقط.
يمكنك العثور على مزيد من المعلومات حول Xet هنا.
استفد من إزالة التكرار في Xet لملفات Parquet
تُكتب ملفات Parquet المُحسّنة باستخدام تقسيم المحتوى المُعرَّف (Content Defined Chunking)، مما يتيح إزالة التكرار. يُسرع هذا عملية الرفع لأن مقاطع البيانات الموجودة مسبقًا على Hugging Face لا تحتاج إلى إعادة رفع، مما يوفر الكثير من عمليات الإدخال/الإخراج (I/O).
على سبيل المثال، يرفع هذا الكود محتوى table ثم بالنسبة إلى edited_table يكون الرفع أسرع لأنه يرفع فقط المقاطع التي تغيّرت:
import pyarrow.parquet as pq
pq.write_table(
table,
"hf://datasets/username/my_dataset/imdb.parquet",
# Optimize for Xet
use_content_defined_chunking=True,
write_page_index=True,
)
edited_table = ... # e.g. with added/modified/removed rows or columns
pq.write_table(
edited_table,
"hf://datasets/username/my_dataset/imdb.parquet",
# Optimize for Xet
use_content_defined_chunking=True,
write_page_index=True,
)تكون المقاطع بحجم ~64kB تقريبًا، ويحفظ Parquet البيانات عمودًا تلو الآخر، لذا عمليًا هذا ما يحدث عند تحرير ملف Parquet محسّن:
- إضافة عمود جديد -> يتم رفع مقاطع العمود الجديد فقط
- إضافة/تعديل/حذف صف -> يتم رفع جزء واحد لكل عمود
وبالإضافة إلى ذلك، يتم رفع مقاطع تذييل Parquet التي تحتوي على البيانات الوصفية.
استخدام الصور
يمكنك تحميل مجلد يحتوي على ملف بيانات وصفية يتضمن حقلًا لأسماء الصور أو مساراتها، على النحو التالي:
Example 1: Example 2:
folder/ folder/
├── metadata.parquet ├── metadata.parquet
├── img000.png └── images
├── img001.png ├── img000.png
... ...
└── imgNNN.png └── imgNNN.pngيمكنك التكرار على مسارات الصور على النحو التالي:
from pathlib import Path
import pyarrow as pq
folder_path = Path("path/to/folder")
table = pq.read_table(folder_path + "metadata.parquet")
for file_name in table["file_name"].to_pylist():
image_path = folder_path / file_name
...بما أن مجموعة البيانات في بنية مدعومة (ملف metadata.parquet يحتوي على حقل file_name)، يمكنك حفظ هذه المجموعة على Hugging Face، وسيعرض عارض مجموعة البيانات (Dataset Viewer) البيانات الوصفية والصور معًا.
from huggingface_hub import HfApi
api = HfApi()
api.upload_folder(
folder_path=folder_path,
repo_id="username/my_image_dataset",
repo_type="dataset",
)تضمين الصور داخل Parquet
يحتوي PyArrow على نوع ثنائي (binary) يتيح تخزين بايتات الصور في جداول Arrow. وبالتالي، فإنه يتيح حفظ مجموعة البيانات كملف Parquet واحد يحتوي على كل من الصور (البايتات والمسار) وبيانات وصف العينات:
import pyarrow as pa
import pyarrow.parquet as pq
# Embed the image bytes in Arrow
image_array = pa.array([
{
"bytes": (folder_path / file_name).read_bytes(),
"path": file_name,
}
for file_name in table["file_name"].to_pylist()
])
table.append_column("image", image_array)
# (Optional) Set the HF Image type for the Dataset Viewer and the `datasets` library
features = {"image": {"_type": "Image"}} # or using datasets.Features(...).to_dict()
schema_metadata = {"huggingface": {"dataset_info": {"features": features}}}
table = table.replace_schema_metadata(schema_metadata)
# Save to Parquet
# (Optional) with use_content_defined_chunking for faster uploads and downloads
pq.write_table(table, "data.parquet", use_content_defined_chunking=True)يسمح تعيين نوع الصورة في بيانات وصفية مخطط Arrow للمكتبات الأخرى وعارض مجموعات بيانات Hugging Face بمعرفة أن “image” يحتوي على صور وليس مجرد بيانات ثنائية.
استخدام الأصوات
يمكنك تحميل مجلد يحتوي على ملف بيانات وصفية يتضمن حقلًا لأسماء المسارات أو المسارات إلى الملفات الصوتية، على النحو التالي:
Example 1: Example 2:
folder/ folder/
├── metadata.parquet ├── metadata.parquet
├── rec000.wav └── audios
├── rec001.wav ├── rec000.wav
... ...
└── recNNN.wav └── recNNN.wavيمكنك التكرار على مسارات الصوت على النحو التالي:
from pathlib import Path
import pyarrow as pq
folder_path = Path("path/to/folder")
table = pq.read_table(folder_path + "metadata.parquet")
for file_name in table["file_name"].to_pylist():
audio_path = folder_path / file_name
...بما أن مجموعة البيانات في بنية مدعومة (ملف metadata.parquet يحتوي على حقل file_name)، يمكنك حفظها على Hugging Face، ويعرض عارض مجموعات البيانات في Hub البيانات الوصفية والصوت معًا.
from huggingface_hub import HfApi
api = HfApi()
api.upload_folder(
folder_path=folder_path,
repo_id="username/my_audio_dataset",
repo_type="dataset",
)تضمين الصوت داخل Parquet
يحتوي PyArrow على نوع ثنائي (binary) يتيح تخزين بايتات الصوت في جداول Arrow. وبالتالي، فإنه يتيح حفظ مجموعة البيانات كملف Parquet واحد يحتوي على الصوت (البايتات والمسار) وبيانات وصفية للعينات:
import pyarrow as pa
import pyarrow.parquet as pq
# Embed the audio bytes in Arrow
audio_array = pa.array([
{
"bytes": (folder_path / file_name).read_bytes(),
"path": file_name,
}
for file_name in table["file_name"].to_pylist()
])
table.append_column("audio", audio_array)
# (Optional) Set the HF Audio type for the Dataset Viewer and the `datasets` library
features = {"audio": {"_type": "Audio"}} # or using datasets.Features(...).to_dict()
schema_metadata = {"huggingface": {"dataset_info": {"features": features}}}
table = table.replace_schema_metadata(schema_metadata)
# Save to Parquet
# (Optional) with use_content_defined_chunking for faster uploads and downloads
pq.write_table(table, "data.parquet", use_content_defined_chunking=True)تعيين نوع الصوت في بيانات وصف مخطط Arrow يمكّن المكتبات الأخرى وعارض مجموعات بيانات Hugging Face من التعرف على أن “audio” يحتوي على بيانات صوتية، وليس مجرد بيانات ثنائية.
Update on GitHub