بعد فتح ملف CSV أو لصقه يكفي اختيار تنزيل Parquet. افتراضيًا يكون كل عمود من نوع STRING بترميز UTF-8 ويقبل القيمة الخالية، فتحتفظ معرّفات مثل 000917 بأصفارها، وتصبح الخلايا الفارغة null. ويُختار اكتشاف الأرقام وقيم true/false لكتابة أعمدة INT64 وDOUBLE وBOOLEAN حيث تناسب كل القيم النوع. يكتب الملفَ في متصفحك برنامجُ كتابة Parquet بلغة JavaScript، ولا يُرفع أي شيء.
طريقة تحويل CSV إلى Parquet
- افتح ملف
.csv أو .tsv أو .txt، أو أفلته على الأداة، أو الصق الصفوف. راجع الجدول في المدخلات، واضبط عند الحاجة المحدِّد أو صف العناوين أو الترميز من إعدادات الاستيراد. - اختر أنواع القيم والضغط، وحدِّد هل تريد كتابة النص الفارغ بقيمة null، واضبط عدد الصفوف في كل مجموعة صفوف.
- اختر تنزيل Parquet، ثم اقرأ ملف
.parquet بأداة DuckDB أو pandas أو Polars أو Spark أو أي قارئ Parquet آخر.
لتحويل ملفات كثيرة بالإعدادات نفسها، اختر دفعة واحدة: تحويل عدة ملفات. يصبح كل ملف ملف Parquet مستقلًا، وتُنزَّل الملفات معًا في ملف ZIP واحد. وفي التحويل دفعة واحدة يجب ألا يتجاوز كل ملف 25 ميغابايت.
المخطط وأنواع الأعمدة
تأتي أسماء الأعمدة من صف العناوين كما كُتبت تمامًا. يصبح العنوان الفارغ Column 3 والمكرر name (2)، فيكون لكل عمود Parquet اسم فريد. وكل عمود اختياري (يقبل القيمة الخالية).
| إبقاء كل القيم نصًا | الخيار الافتراضي. كل عمود من نوع BYTE_ARRAY موسوم بأنه سلسلة UTF-8، ويحمل كل قيمة بايتًا ببايت، بما في ذلك الأصفار في البداية و1,5 وN/A وتنسيقات التواريخ. |
|---|---|
| الأعداد الصحيحة (مع الاكتشاف) | INT64 إذا كانت كل القيم غير الفارغة أعدادًا صحيحة بلا أصفار في البداية، من −9,007,199,254,740,991 إلى 9,007,199,254,740,991. والأعداد الأكبر تُبقي العمود نصًا. |
| الأعداد العشرية (مع الاكتشاف) | DOUBLE إذا كانت كل القيم أعدادًا عشرية بسيطة لا تتجاوز 15 رقمًا معنويًا، فتبقى سليمة بعد التحويل. والعمود الذي يجمع 12 و2.5 يصبح DOUBLE. |
| true / false (مع الاكتشاف) | BOOLEAN إذا كانت كل القيم true أو false بأي حالة أحرف. |
| التواريخ والطوابع الزمنية | تبقى STRING في الوضعين، مثل 2026-03-01T08:00:00Z. وتُحوَّل أنواعها في محرك الاستعلام، مثل CAST(reading_at AS TIMESTAMP) في DuckDB. |
في الأعمدة ذات الأنواع تكون الخلية الفارغة دائمًا null. أما في الأعمدة النصية فيحدد خيار كتابة النص الفارغ بقيمة null (المفعّل افتراضيًا) هل تصبح الخلية الفارغة null أم سلسلة فارغة "".
الضغط ومجموعات الصفوف
| Snappy (سريع، والخيار الشائع) | طريقة الضغط الافتراضية، ويدعمها كل قارئ Parquet شائع. |
|---|---|
| Gzip (حجم أصغر) | يعطي عادةً ملفًا أصغر من Snappy. وبعض القارئات الخفيفة لا تتضمن دعم gzip. |
| بلا ضغط | دون ضغط، لتصحيح الأخطاء أو للأدوات التي لا تملك أداة فك ضغط. |
| عدد الصفوف في كل مجموعة صفوف | الافتراضي 100 ألف، بين ألف ومليون. ولأن مساحة العمل في المتصفح تتسع لـ100 ألف صف على الأكثر، يكتب الإعداد الافتراضي مجموعة صفوف واحدة؛ واضبط قيمة أصغر للحصول على عدة مجموعات صفوف يمكن للقارئات تخطيها أو قراءتها بالتوازي. |
ويسجّل الملف أيضًا في بياناته الوصفية اسم برنامج الكتابة (hyparquet) ومفتاح created_by_app.
مشكلات شائعة في تحويل CSV إلى Parquet
- عمود رقمي من نوع STRING. إما أن إبقاء كل القيم نصًا مختار، أو أن إحدى القيم ليست رقمًا بسيطًا، مثل
1,234 أو 12 kg أو 007 أو عدد عشري من 16 رقمًا. ابحث عنها في وصف الأعمدة أو عارض CSV. - فقدت المعرّفات أصفارها في أداة أخرى. لا يجعل هذا المحوّل أبدًا عمودًا فيه أصفار في البداية رقميًا. فإذا تغيّرت المعرّفات، فالأرجح أن ملف CSV فُتح وحُفظ في جدول بيانات قبل التحويل؛ راجع الملف المصدر في عارض CSV.
- البيانات كلها في عمود واحد. خُمِّن المحدِّد خطأً؛ اختره من إعدادات الاستيراد.
- الملف أكبر من أن تعالجه هذه الأداة. يعمل التحويل إلى Parquet على ملفات حتى 25 ميغابايت و100 ألف صف و250 عمودًا ومليوني خلية. قسّم ملف CSV وحوّل الأجزاء، أو اضغط ملف CSV بصيغة gzip إذا كنت تحتاج فقط إلى ملف أصغر للتنزيل.
الحدود والخصوصية
يجب أن يُفتح ملف CSV في مساحة العمل في المتصفح: حتى 25 ميغابايت و100 ألف صف و250 عمودًا ومليوني خلية. ويُبنى ملف Parquet في الذاكرة في مرور واحد.
برنامج الكتابة هو hyparquet-writer، وهو مكتبة مكتوبة بالكامل بلغة JavaScript لا تُحمَّل إلا عند التحويل؛ فلا WebAssembly ولا خطوة على خادم. ويعمل في عامل خلفي داخل علامة التبويب هذه، فتبقى الصفحة مستجيبة ويوقفه زر إلغاء. ولا يُرسل ملف CSV أبدًا إلى أي خادم. وللحصول على ملف قاعدة بيانات قابل للاستعلام بدلًا من ذلك، استخدم CSV إلى SQLite.
مثال: قراءات مستشعرات تُقرأ من جديد بمكتبة PyArrow
قراءات أجهزة استشعار فيها معرّفات تبدأ بأصفار، وطوابع زمنية بصيغة ISO، وخلايا فارغة، وفاصلة داخل علامتي اقتباس، حُوّلت مع اكتشاف الأرقام وقيم true/false وضغط Snappy الافتراضي، ثم قُرئت بمكتبة PyArrow. أصبح temp_c من نوع DOUBLE وok من نوع BOOLEAN؛ وبقي sensor_id وreading_at سلاسل نصية. ومع الخيار الافتراضي إبقاء كل القيم نصًا تكون الأعمدة الخمسة كلها string ويحتفظ ok بالقيمة TRUE كما كُتبت.
sensor_id,reading_at,temp_c,ok,site 000917,2026-03-01T08:00:00Z,21.5,true,Lab 2 000918,2026-03-01T08:05:00Z,,false, 000919,2026-03-01T08:10:00Z,-3,TRUE,"Roof, north"
schema:
sensor_id: string
reading_at: string
temp_c: double
ok: bool
site: string
rows: 3, row groups: 1, compression: SNAPPY
{'sensor_id': '000917', 'reading_at': '2026-03-01T08:00:00Z', 'temp_c': 21.5, 'ok': True, 'site': 'Lab 2'}
{'sensor_id': '000918', 'reading_at': '2026-03-01T08:05:00Z', 'temp_c': None, 'ok': False, 'site': None}
{'sensor_id': '000919', 'reading_at': '2026-03-01T08:10:00Z', 'temp_c': -3.0, 'ok': True, 'site': 'Roof, north'}أسئلة وأجوبة
هل يُرفع ملف CSV لتحويله؟
لا. تكتب ملف Parquet مكتبة JavaScript في عامل خلفي داخل علامة التبويب في متصفحك، ويُنشأ الملف المنزَّل محليًا.
لماذا لا تُكتب التواريخ بنوع DATE أو TIMESTAMP في Parquet؟
تأتي التواريخ في ملفات CSV بتنسيقات ومناطق زمنية كثيرة، وتخمينها دون تنبيه قد يزيح القيم. لذا تُكتب سلاسل نصية كما في الملف تمامًا؛ وتُحوَّل أنواعها في DuckDB أو Spark أو pandas، حيث تختار أنت التنسيق والمنطقة الزمنية.
أي طريقة ضغط أختار؟
يعمل Snappy مع كل قارئات Parquet تقريبًا. واختر gzip إذا كان حجم الملف أهم وكان قارئك يدعمه، و«بلا ضغط» لتصحيح الأخطاء فقط.