تحميل JSON المنظَّم
NDJSON (JSON المحدَّد بسطر جديد)، المعروف بـ JSONEachRow في ClickHouse، وأنها ذات بنية منتظمة، أي أن أسماء الأعمدة وأنواعها ثابتة. يُعدّ NDJSON التنسيق المفضَّل لتحميل JSON نظرًا لإيجازه واستخدامه الفعّال للمساحة، غير أن تنسيقات أخرى مدعومة أيضًا لكلٍّ من الإدخال والإخراج.
خذ بعين الاعتبار نموذج JSON التالي، الذي يمثّل سجلاً من مجموعة بيانات بايثون PyPI:
فضّل المخططات الثابتة كلما أمكنفي الحالات التي تكون فيها الأعمدة ذات أسماء وأنواع ثابتة، ولا يُتوقع إضافة أعمدة جديدة، فاحرص دائمًا في بيئة الإنتاج على استخدام مخطط مُعرّف مسبقًا وثابتًا.ويُفضَّل نوع JSON للبيانات عالية الديناميكية، حيث تكون أسماء الأعمدة وأنواعها عرضة للتغيير. كما يكون هذا النوع مفيدًا أيضًا في إعداد النماذج الأولية واستكشاف البيانات.
مفاتيح الترتيباخترنا هنا مفتاح ترتيب باستخدام عبارة
ORDER BY. لمزيد من التفاصيل حول مفاتيح الترتيب وكيفية اختيارها، راجع هذا القسم.*.json.gz في الـ bucket. يستنتج ClickHouse تلقائياً أن الصيغة هي JSONEachRow (ndjson) انطلاقاً من امتداد الملف ومحتوياته. يمكن تحديد الصيغة يدوياً عبر دوال المعاملات إذا تعذّر على ClickHouse اكتشافها.
الملفات المضغوطةالملفات المذكورة أعلاه مضغوطة أيضًا. ويتعرّف ClickHouse على ذلك ويتعامل معه تلقائيًا.
INSERT INTO SELECT:
FORMAT، مثلًا.
JSONEachRow. كما أن تنسيقات JSON الشائعة الأخرى مدعومة أيضًا، وتتوفر هنا أمثلة على كيفية تحميلها.
تحميل JSON شبه المهيكل
JSON مخصص.
تأمل المثال التالي من نسخة موسعة من مجموعة بيانات Python PyPI dataset أعلاه. هنا أضفنا عمود tags عشوائيًا يحتوي على أزواج مفتاح-قيمة عشوائية.
tags هنا غير متوقَّع، لذا يستحيل علينا نمذجته. لتحميل هذه البيانات، يمكننا استخدام المخطط السابق، مع إضافة عمود tags من النوع JSON:
متى تستخدم نوع JSON
- تحتوي على مفاتيح غير متوقعة يمكن أن تتغير بمرور الوقت.
- تتضمن قيماً ذات أنواع متفاوتة (على سبيل المثال، قد يحتوي المسار أحياناً على سلسلة نصية وأحياناً أخرى على رقم).
- تتطلب مرونة في المخطط عندما لا يكون التحديد الصارم للأنواع عملياً.
- بنية مسطحة ذات مفاتيح معروفة: استخدم أنواع الأعمدة القياسية مثل String.
- تداخلاً متوقعاً: استخدم أنواع Tuple أو Array أو Nested لهذه البنى.
- بنية متوقعة مع أنواع متفاوتة: فكّر في استخدام النوعين Dynamic أو Variant بدلاً من ذلك.