> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# العمل مع Parquet في ClickHouse

> صفحة تشرح كيفية العمل مع Parquet في ClickHouse

يُعد Parquet تنسيق ملفات فعّالًا لتخزين البيانات بصيغة عمودية.
يوفّر ClickHouse دعمًا لقراءة ملفات Parquet وكتابتها.

<Tip>
  عند الإشارة إلى مسار ملف في استعلام، يعتمد الموضع الذي سيحاول ClickHouse القراءة منه على إصدار ClickHouse الذي تستخدمه.

  إذا كنت تستخدم [`clickhouse-local`](/docs/ar/concepts/features/tools-and-utilities/clickhouse-local)، فستتم القراءة من موقع نسبي إلى المكان الذي شغّلت منه ClickHouse Local.
  إذا كنت تستخدم ClickHouse Server أو ClickHouse Cloud عبر `clickhouse client`، فستتم القراءة من موقع نسبي إلى الدليل `/var/lib/clickhouse/user_files/` على الخادم.
</Tip>

<div id="importing-from-parquet">
  ## الاستيراد من Parquet
</div>

قبل تحميل البيانات، يمكننا استخدام الدالة [file()](/docs/ar/reference/functions/regular-functions/files#file) لاستعراض بنية [ملف Parquet تجريبي](https://clickhouse-docs-assets.s3.us-east-1.amazonaws.com/data.parquet):

```sql theme={null}
DESCRIBE TABLE file('data.parquet', Parquet);
```

لقد استخدمنا [Parquet](/docs/ar/reference/formats/Parquet/Parquet) كوسيطةٍ ثانية لكي يعرف ClickHouse تنسيق الملف. سيطبع هذا الأعمدة مع أنواعها:

```response theme={null}
┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ Nullable(String) │              │                    │         │                  │                │
│ date │ Nullable(String) │              │                    │         │                  │                │
│ hits │ Nullable(Int64)  │              │                    │         │                  │                │
└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
```

يمكننا أيضًا استكشاف الملفات قبل استيراد البيانات فعليًا، باستخدام إمكانات SQL الكاملة:

```sql theme={null}
SELECT *
FROM file('data.parquet', Parquet)
LIMIT 3;
```

```response theme={null}
┌─path──────────────────────┬─date───────┬─hits─┐
│ Akiba_Hebrew_Academy      │ 2017-08-01 │  241 │
│ Aegithina_tiphia          │ 2018-02-01 │   34 │
│ 1971-72_Utah_Stars_season │ 2016-10-01 │    1 │
└───────────────────────────┴────────────┴──────┘
```

<Tip>
  يمكننا تجاوز تحديد التنسيق صراحةً لـ `file()` و `INFILE`/`OUTFILE`.
  في هذه الحالة، سيحدِّد ClickHouse التنسيق تلقائيًا استنادًا إلى امتداد الملف.
</Tip>

<div id="importing-to-an-existing-table">
  ## الاستيراد إلى جدول موجود
</div>

فلننشئ جدولًا سنستورد إليه بيانات Parquet:

```sql theme={null}
CREATE TABLE sometable
(
    `path` String,
    `date` Date,
    `hits` UInt32
)
ENGINE = MergeTree
ORDER BY (date, path);
```

يمكننا الآن استيراد البيانات باستخدام الجملة `FROM INFILE`:

```sql theme={null}
INSERT INTO sometable
FROM INFILE 'data.parquet' FORMAT Parquet;

SELECT *
FROM sometable
LIMIT 5;
```

```response theme={null}
┌─path──────────────────────────┬───────date─┬─hits─┐
│ 1988_in_philosophy            │ 2015-05-01 │   70 │
│ 2004_Green_Bay_Packers_season │ 2015-05-01 │  970 │
│ 24_hours_of_lemans            │ 2015-05-01 │   37 │
│ 25604_Karlin                  │ 2015-05-01 │   20 │
│ ASCII_ART                     │ 2015-05-01 │    9 │
└───────────────────────────────┴────────────┴──────┘
```

لاحظ كيف حوّل ClickHouse تلقائيًا السلاسل النصية في Parquet (في العمود `date`) إلى النوع `Date`. ويعود ذلك إلى أن ClickHouse يُجري تحويلًا تلقائيًا للنوع استنادًا إلى الأنواع الموجودة في الجدول الهدف.

<div id="inserting-a-local-file-to-remote-server">
  ## إدراج ملف محلي في خادم بعيد
</div>

إذا كنت تريد إدراج ملف Parquet محلي في خادم ClickHouse بعيد، فيمكنك القيام بذلك بتمرير محتويات الملف إلى `clickhouse-client`، كما هو موضح أدناه:

```sql theme={null}
clickhouse client -q "INSERT INTO sometable FORMAT Parquet" < data.parquet
```

<div id="creating-new-tables-from-parquet-files">
  ## إنشاء جداول جديدة من ملفات Parquet
</div>

بما أن ClickHouse يقرأ مخطط ملف Parquet، يمكننا إنشاء الجداول مباشرةً:

```sql theme={null}
CREATE TABLE imported_from_parquet
ENGINE = MergeTree
ORDER BY tuple() AS
SELECT *
FROM file('data.parquet', Parquet)
```

سيؤدي ذلك تلقائيًا إلى إنشاء جدول وملئه من ملف Parquet معيّن:

```sql theme={null}
DESCRIBE TABLE imported_from_parquet;
```

```response theme={null}
┌─name─┬─type─────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ path │ Nullable(String) │              │                    │         │                  │                │
│ date │ Nullable(String) │              │                    │         │                  │                │
│ hits │ Nullable(Int64)  │              │                    │         │                  │                │
└──────┴──────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
```

افتراضيًا، يتعامل ClickHouse بصرامة مع أسماء الأعمدة والأنواع والقيم. لكن في بعض الحالات، يمكن تخطي الأعمدة غير الموجودة أو القيم غير المدعومة أثناء الاستيراد. ويمكن التحكم في ذلك باستخدام [إعدادات Parquet](/docs/ar/reference/formats/Parquet/Parquet#format-settings).

<div id="exporting-to-parquet-format">
  ## التصدير إلى تنسيق Parquet
</div>

<Tip>
  عند استخدام `INTO OUTFILE` مع ClickHouse Cloud، ستحتاج إلى تشغيل الأوامر عبر `clickhouse client` على الجهاز الذي سيُكتب فيه الملف.
</Tip>

لتصدير أي جدول أو نتيجة استعلام إلى ملف Parquet، يمكن استخدام عبارة `INTO OUTFILE`:

```sql theme={null}
SELECT *
FROM sometable
INTO OUTFILE 'export.parquet'
FORMAT Parquet
```

سينشئ ذلك الملف `export.parquet` في دليل العمل.

<div id="clickhouse-and-parquet-data-types">
  ## أنواع البيانات في ClickHouse وParquet
</div>

تتطابق أنواع البيانات في ClickHouse وParquet إلى حدٍّ كبير، لكنها [تختلف قليلًا](/docs/ar/reference/formats/Parquet/Parquet#data-types-matching-parquet). على سبيل المثال، يصدِّر ClickHouse النوع `DateTime` بصيغة `int64` في Parquet. وإذا استوردنا هذا مجددًا إلى ClickHouse، فسنرى أرقامًا ([ملف time.parquet](https://clickhouse-docs-assets.s3.us-east-1.amazonaws.com/time.parquet)):

```sql theme={null}
SELECT * FROM file('time.parquet', Parquet);
```

```response theme={null}
┌─n─┬───────time─┐
│ 0 │ 1673622611 │
│ 1 │ 1673622610 │
│ 2 │ 1673622609 │
│ 3 │ 1673622608 │
│ 4 │ 1673622607 │
└───┴────────────┘
```

في هذه الحالة، يمكن استخدام [تحويل الأنواع](/docs/ar/reference/functions/regular-functions/type-conversion-functions):

```sql theme={null}
SELECT
    n,
    toDateTime(time)                 <--- int to time
FROM file('time.parquet', Parquet);
```

```response theme={null}
┌─n─┬────toDateTime(time)─┐
│ 0 │ 2023-01-13 15:10:11 │
│ 1 │ 2023-01-13 15:10:10 │
│ 2 │ 2023-01-13 15:10:09 │
│ 3 │ 2023-01-13 15:10:08 │
│ 4 │ 2023-01-13 15:10:07 │
└───┴─────────────────────┘
```

<div id="further-reading">
  ## للمزيد من القراءة
</div>

يوفّر ClickHouse دعمًا للعديد من التنسيقات، النصية والثنائية على حدّ سواء، لتلبية مختلف السيناريوهات والمنصات. اطّلع على المزيد من التنسيقات وطرق العمل معها في المقالات التالية:

* [تنسيقات CSV وTSV](/docs/ar/guides/clickhouse/data-formats/csv-tsv)
* [Avro وArrow وORC](/docs/ar/guides/clickhouse/data-formats/arrow-avro-orc)
* [تنسيقات JSON](/docs/ar/guides/clickhouse/data-formats/json/intro)
* [Regex وTemplate](/docs/ar/guides/clickhouse/data-formats/templates-regex)
* [تنسيقات Native والثنائية](/docs/ar/guides/clickhouse/data-formats/binary)
* [تنسيقات SQL](/docs/ar/guides/clickhouse/data-formats/sql)

واطّلع أيضًا على [clickhouse-local](https://clickhouse.com/blog/extracting-converting-querying-local-files-with-sql-clickhouse-local) - وهي أداة محمولة متكاملة الميزات للعمل على الملفات المحلية/البعيدة دون الحاجة إلى ClickHouse server.
