Datasets documentation
الاستخدام مع PyArrow
الاستخدام مع PyArrow
هذا المستند مقدمة سريعة لاستخدام datasets مع PyArrow، مع تركيز خاص على كيفية معالجة مجموعات البيانات باستخدام دوال Arrow الحاسوبية، وكيفية تحويل مجموعة بيانات إلى PyArrow أو من PyArrow.
يُعدّ هذا مفيدًا بشكل خاص لأنه يتيح عمليات سريعة بدون نسخ، حيث يستخدم datasets PyArrow في الخلفية.
تنسيق مجموعة البيانات
بشكل افتراضي، تُرجع مجموعات البيانات كائنات بايثون العادية: أعداد صحيحة، وأعداد عشرية، ونصوص، وقوائم، وما إلى ذلك.
للحصول على جداول أو مصفوفات PyArrow بدلاً من ذلك، يمكنك تعيين صيغة مجموعة البيانات إلى pyarrow باستخدام Dataset.with_format():
>>> from datasets import Dataset
>>> data = {"col_0": ["a", "b", "c", "d"], "col_1": [0., 0., 1., 1.]}
>>> ds = Dataset.from_dict(data)
>>> ds = ds.with_format("arrow")
>>> ds[0] # pa.Table
pyarrow.Table
col_0: string
col_1: double
----
col_0: [["a"]]
col_1: [[0]]
>>> ds[:2] # pa.Table
pyarrow.Table
col_0: string
col_1: double
----
col_0: [["a","b"]]
col_1: [[0,0]]
>>> ds["data"] # pa.array
<pyarrow.lib.ChunkedArray object at 0x1394312a0>
[
[
"a",
"b",
"c",
"d"
]
]يعمل هذا أيضًا مع كائنات IterableDataset التي يتم الحصول عليها، على سبيل المثال، باستخدام load_dataset(..., streaming=True):
>>> ds = ds.with_format("arrow")
>>> for table in ds.iter(batch_size=2):
... print(table)
... break
pyarrow.Table
col_0: string
col_1: double
----
col_0: [["a","b"]]
col_1: [[0,0]]معالجة البيانات
تكون دوال PyArrow أسرع بشكل عام من دوال بايثون المكتوبة يدوياً، ولذلك فهي خيار جيد لتحسين معالجة البيانات. يمكنك استخدام دوال Arrow compute لمعالجة مجموعة بيانات في Dataset.map() أو Dataset.filter():
>>> import pyarrow.compute as pc
>>> from datasets import Dataset
>>> data = {"col_0": ["a", "b", "c", "d"], "col_1": [0., 0., 1., 1.]}
>>> ds = Dataset.from_dict(data)
>>> ds = ds.with_format("arrow")
>>> ds = ds.map(lambda t: t.append_column("col_2", pc.add(t["col_1"], 1)), batched=True)
>>> ds[:2]
pyarrow.Table
col_0: string
col_1: double
col_2: double
----
col_0: [["a","b"]]
col_1: [[0,0]]
col_2: [[1,1]]
>>> ds = ds.filter(lambda t: pc.equal(t["col_0"], "b"), batched=True)
>>> ds[0]
pyarrow.Table
col_0: string
col_1: double
col_2: double
----
col_0: [["b"]]
col_1: [[0]]
col_2: [[1]]نستخدم batched=True لأن معالجة دفعات البيانات في PyArrow أسرع من معالجتها صفًا بصف. كما يمكن استخدام batch_size= في map() لتحديد حجم كل table.
يعمل هذا أيضًا مع IterableDataset.map() و IterableDataset.filter().
استيراد أو تصدير من PyArrow
يُعدّ Dataset غلافًا لجدول PyArrow، حيث يمكنك إنشاء Dataset مباشرةً من الجدول:
ds = Dataset(table)
يمكنك الوصول إلى جدول PyArrow الخاص بمجموعة البيانات باستخدام Dataset.data، والذي يعيد MemoryMappedTable أو InMemoryTable أو ConcatenationTable، اعتماداً على مصدر بيانات Arrow والعمليات التي تم تطبيقها.
تغلّف تلك الكائنات جدول PyArrow الأساسي المتاح عند Dataset.data.table. يحتوي هذا الجدول على جميع بيانات مجموعة البيانات، لكن قد يكون هناك أيضًا فهرس للتعيين عند Dataset._indices يقوم بتعيين فهارس صفوف مجموعة البيانات إلى فهارس صفوف جدول PyArrow. قد يحدث ذلك إذا تم خلط مجموعة البيانات باستخدام Dataset.shuffle() أو إذا تم استخدام مجموعة فرعية فقط من الصفوف (على سبيل المثال، بعد Dataset.select()).
في الحالة العامة، يمكنك تصدير مجموعة بيانات إلى جدول PyArrow باستخدام table = ds.with_format("arrow")[:].