الانتقال إلى المحتوى الرئيسي
تفترض الأمثلة السابقة الخاصة بتحميل بيانات JSON استخدام JSONEachRow (NDJSON). يقرأ هذا التنسيق المفاتيح في كل سطر JSON باعتبارها أعمدة. على سبيل المثال:
مع أن هذا هو عمومًا التنسيق الأكثر شيوعًا لملفات JSON، فستصادف تنسيقات أخرى، أو قد تحتاج إلى قراءة JSON ككائن واحد. نوفّر أدناه أمثلة على قراءة JSON وتحميله بتنسيقات شائعة أخرى.

قراءة JSON ككائن

تُظهر أمثلتنا السابقة كيف يقرأ JSONEachRow تنسيق newline-delimited JSON، بحيث يُقرأ كل سطر ككائن منفصل يُربَط بصف في جدول، ويُربَط كل مفتاح بعمود. وهذا مثالي في الحالات التي تكون فيها بنية JSON معروفة ويكون لكل عمود نوع واحد فقط. في المقابل، يتعامل JSONAsObject مع كل سطر على أنه كائن JSON واحد ويخزّنه في عمود واحد من النوع JSON، مما يجعله أنسب لحمولات JSON المتداخلة وللحالات التي تكون فيها المفاتيح ديناميكية وقد تحتمل أكثر من نوع واحد. استخدم JSONEachRow لعمليات الإدراج على مستوى الصفوف، وJSONAsObject عند تخزين بيانات JSON مرنة أو ديناميكية. قارن المثال أعلاه بالاستعلام التالي، الذي يقرأ البيانات نفسها على أنها كائن JSON واحد لكل سطر:
يُعد JSONAsObject مفيدًا لإدراج صفوف في جدول باستخدام عمود واحد من نوع كائن JSON، على سبيل المثال.
قد يكون التنسيق JSONAsObject مفيدًا أيضًا لقراءة JSON مفصول بأسطر جديدة في الحالات التي تكون فيها بنية الكائنات غير متسقة. على سبيل المثال، إذا كان نوع أحد المفاتيح يختلف بين الصفوف (فقد يكون أحيانًا سلسلة نصية، وفي أحيان أخرى كائنًا). في مثل هذه الحالات، لا يستطيع ClickHouse استنتاج مخطط ثابت باستخدام JSONEachRow، بينما يتيح JSONAsObject إدخال البيانات دون فرض قيود صارمة على الأنواع، مع تخزين كل صف JSON كاملًا في عمود واحد. على سبيل المثال، لاحظ كيف يفشل JSONEachRow في المثال التالي:
في المقابل، يمكن استخدام JSONAsObject في هذه الحالة، لأن النوع JSON يدعم أنواعًا متعددة للعمود الفرعي نفسه.

مصفوفة من كائنات JSON

من أكثر أشكال بيانات JSON شيوعًا أن تكون هناك قائمة من كائنات JSON ضمن مصفوفة JSON، كما في هذا المثال:
لننشئ جدولًا لهذا النوع من البيانات:
لاستيراد قائمة من كائنات JSON، يمكن استخدام تنسيق JSONEachRow (لإدراج البيانات من ملف list.json):
استخدمنا عبارة FROM INFILE لتحميل البيانات من الملف المحلي، ويمكننا ملاحظة أن الاستيراد قد نجح:

مفاتيح كائنات JSON

في بعض الحالات، يمكن ترميز قائمة من كائنات JSON كخصائص للكائن بدلًا من عناصر في المصفوفة (راجع objects.json للاطلاع على مثال):
يمكن لـ ClickHouse تحميل بيانات من هذا النوع باستخدام تنسيق JSONObjectEachRow:

تحديد قيم مفاتيح الكائن الأب

لنفترض أننا نريد أيضًا حفظ القيم الموجودة في مفاتيح الكائن الأب داخل الجدول. في هذه الحالة، يمكننا استخدام الخيار التالي لتحديد اسم العمود الذي نريد حفظ قيم المفاتيح فيه:
الآن، يمكننا التحقق من البيانات التي ستُحمَّل من ملف JSON الأصلي باستخدام الدالة file():
لاحظ كيف تمّت تعبئة العمود id بقيم المفاتيح على نحو صحيح.

مصفوفات JSON

أحيانًا، لتوفير المساحة، تُرمَّز ملفات JSON على هيئة مصفوفات بدلًا من كائنات. في هذه الحالة، نتعامل مع قائمة من مصفوفات JSON:
في هذه الحالة، سيحمّل ClickHouse هذه البيانات ويُسنِد كل قيمة إلى العمود المقابل وفقًا لترتيبها في المصفوفة. نستخدم التنسيق JSONCompactEachRow لهذا الغرض:

استيراد أعمدة منفردة من مصفوفات JSON

في بعض الحالات، يمكن ترميز البيانات على مستوى الأعمدة بدلًا من الصفوف. في هذه الحالة، يحتوي كائن JSON رئيسي على أعمدة تتضمن قيمًا. ألقِ نظرة على الملف التالي:
يستخدم ClickHouse تنسيق JSONColumns لتحليل البيانات المُنسَّقة كما يلي:
كما يُدعَم أيضًا تنسيق أكثر إحكامًا عند التعامل مع مصفوفة من الأعمدة بدلًا من كائن، باستخدام تنسيق JSONCompactColumns:

حفظ كائنات JSON بدلًا من تحليلها

قد تكون هناك حالات ترغب فيها في حفظ كائنات JSON في عمود String واحد (أو JSON) بدلًا من تحليلها. وقد يكون ذلك مفيدًا عند التعامل مع قائمة من كائنات JSON ذات بُنى مختلفة. لنأخذ هذا الملف على سبيل المثال، حيث لدينا عدة كائنات JSON مختلفة داخل قائمة رئيسية:
نريد حفظ كائنات JSON الأصلية في الجدول التالي:
يمكننا الآن تحميل البيانات من الملف إلى هذا الجدول باستخدام التنسيق JSONAsString للاحتفاظ بكائنات JSON بدلًا من تحليلها:
ويمكننا استخدام دوال JSON للاستعلام عن الكائنات المحفوظة:
لاحظ أن JSONAsString يعمل بكفاءة تامة في الحالات التي تكون فيها الملفات منسّقة بحيث يحتوي كل سطر على كائن JSON واحد (ويُستخدم ذلك عادةً مع التنسيق JSONEachRow).

مخطط الكائنات المتداخلة

في الحالات التي نتعامل فيها مع كائنات JSON المتداخلة، يمكننا أيضًا تحديد مخطط صريح واستخدام الأنواع المعقدة (Array، JSON أو Tuple) لتحميل البيانات:

الوصول إلى كائنات JSON المتداخلة

يمكن الإشارة إلى مفاتيح JSON المتداخلة عبر تفعيل خيار الإعدادات التالي:
يتيح لنا هذا الإشارة إلى مفاتيح كائنات JSON المتداخلة باستخدام ترميز النقطة (وتذكّر إحاطتها بعلامات الـbacktick لكي يعمل ذلك):
بهذه الطريقة، يمكننا تسطيح كائنات JSON المتداخلة أو استخدام بعض القيم الموجودة داخلها لحفظها في أعمدة منفصلة.

تجاهل الأعمدة غير المعروفة

بشكل افتراضي، يتجاهل ClickHouse الأعمدة غير المعروفة عند استيراد بيانات JSON. لنجرب استيراد الملف الأصلي إلى الجدول من دون العمود month:
لا يزال بإمكاننا إدراج بيانات JSON الأصلية ذات الأعمدة الثلاثة في هذا الجدول:
سيتجاهل ClickHouse الأعمدة غير المعروفة أثناء الاستيراد. يمكن إيقاف هذا السلوك باستخدام خيار الإعدادات ‏input_format_skip_unknown_fields:
سيرمي ClickHouse استثناءات في حال عدم اتساق بنية JSON وبنية أعمدة الجدول.

BSON

يتيح ClickHouse تصدير البيانات إلى ملفات مُشفَّرة بتنسيق BSON واستيرادها منها. يُستخدم هذا التنسيق في بعض نظم إدارة قواعد البيانات، مثل MongoDB. لاستيراد بيانات BSON، نستخدم تنسيق BSONEachRow. لنستورد البيانات من ملف BSON هذا:
يمكننا أيضًا التصدير إلى ملفات BSON بالصيغة نفسها:
بعد ذلك، سيتم تصدير بياناتنا إلى الملف out.bson.
آخر تعديل في ٢ يوليو ٢٠٢٦