| الإدخال | إخراج | اسم بديل |
|---|---|---|
| ✔ | ✔ |
الوصف
في هذا التنسيق، تُمثَّل جميع البيانات على شكل كائن JSON واحد، ويُمثَّل كل صف كحقل منفصل ضمن هذا الكائن، على غرار تنسيق JSONEachRow.
مثال للاستخدام
مثال بسيط
إذا كانت لدينا بعض بيانات JSON:
{
"row_1": {"num": 42, "str": "hello", "arr": [0,1]},
"row_2": {"num": 43, "str": "hello", "arr": [0,1,2]},
"row_3": {"num": 44, "str": "hello", "arr": [0,1,2,3]}
}لاستخدام اسم كائن كقيمة لعمود، يمكنك استخدام الإعداد الخاص format_json_object_each_row_column_for_object_name.
تُعيَّن قيمة هذا الإعداد إلى اسم عمود، ويُستخدم هذا الاسم كمفتاح JSON للصف في الكائن الناتج.
المخرجات
لنفترض أن لدينا الجدول test ويحتوي على عمودين:
┌─object_name─┬─number─┐
│ first_obj │ 1 │
│ second_obj │ 2 │
│ third_obj │ 3 │
└─────────────┴────────┘لنُخرج الناتج بتنسيق JSONObjectEachRow ونستخدم الإعداد format_json_object_each_row_column_for_object_name:
SELECT * FROM test SETTINGS format_json_object_each_row_column_for_object_name='object_name'{
"first_obj": {"number": 1},
"second_obj": {"number": 2},
"third_obj": {"number": 3}
}الإدخال
لنفترض أننا خزّنا ناتج المثال السابق في ملف باسم data.json:
SELECT * FROM file('data.json', JSONObjectEachRow, 'object_name String, number UInt64') SETTINGS format_json_object_each_row_column_for_object_name='object_name'┌─object_name─┬─number─┐
│ first_obj │ 1 │
│ second_obj │ 2 │
│ third_obj │ 3 │
└─────────────┴────────┘ويعمل أيضًا مع استدلال المخطط:
DESCRIBE file('data.json', JSONObjectEachRow) SETTING format_json_object_each_row_column_for_object_name='object_name'┌─name────────┬─type────────────┐
│ object_name │ String │
│ number │ Nullable(Int64) │
└─────────────┴─────────────────┘إدخال البيانات
INSERT INTO UserActivity FORMAT JSONEachRow {"PageViews":5, "UserID":"4324182021466249494", "Duration":146,"Sign":-1} {"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1}يسمح ClickHouse بما يلي:
- أي ترتيب لأزواج المفتاح والقيمة داخل الكائن.
- حذف بعض القيم.
يتجاهل ClickHouse المسافات بين العناصر والفواصل بعد الكائنات. يمكنك تمرير جميع الكائنات في سطر واحد. ولا يلزم فصلها بأسطر جديدة.
معالجة القيم المحذوفة
يستبدل ClickHouse القيم المحذوفة بالقيم الافتراضية لأنواع البيانات المقابلة.
إذا جرى تحديد DEFAULT expr، يستخدم ClickHouse قواعد استبدال مختلفة وفقًا للإعداد input_format_defaults_for_omitted_fields.
تأمل الجدول التالي:
CREATE TABLE IF NOT EXISTS example_table
(
x UInt32,
a DEFAULT x * 2
) ENGINE = Memory;- إذا كانت
input_format_defaults_for_omitted_fields = 0، فإن القيمة الافتراضية لكلٍّ منxوaهي0(لأنها القيمة الافتراضية لنوع البياناتUInt32). - إذا كانت
input_format_defaults_for_omitted_fields = 1، فإن القيمة الافتراضية لـxهي0، لكن القيمة الافتراضية لـaهيx * 2.
استعلام البيانات
لنأخذ جدول UserActivity مثالًا:
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
│ 4324182021466249494 │ 5 │ 146 │ -1 │
│ 4324182021466249494 │ 6 │ 185 │ 1 │
└─────────────────────┴───────────┴──────────┴──────┘يُرجع الاستعلام SELECT * FROM UserActivity FORMAT JSONEachRow ما يلي:
{"UserID":"4324182021466249494","PageViews":5,"Duration":146,"Sign":-1}
{"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1}على عكس تنسيق JSON، لا تُستبدل تسلسلات UTF-8 غير الصالحة. تُفلت القيم بالطريقة نفسها كما في JSON.
استخدام البُنى Nested
إذا كان لديك جدول يحتوي على أعمدة من نوع البيانات Nested، فيمكنك إدراج بيانات JSON بالبنية نفسها. فعِّل هذه الميزة باستخدام الإعداد input_format_import_nested_json.
على سبيل المثال، تأمل الجدول التالي:
CREATE TABLE json_each_row_nested (n Nested (s String, i Int32) ) ENGINE = Memoryكما ترى في وصف نوع البيانات Nested، يتعامل ClickHouse مع كل مكوّن من البنية المتداخلة على أنه عمود منفصل (n.s و n.i في جدولنا). يمكنك إدراج البيانات بالطريقة التالية:
INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n.s": ["abc", "def"], "n.i": [1, 23]}لإدراج البيانات ككائن JSON هرمي، اضبط input_format_import_nested_json=1.
{
"n": {
"s": ["abc", "def"],
"i": [1, 23]
}
}بدون هذا الإعداد، يُطلق ClickHouse استثناءً.
SELECT name, value FROM system.settings WHERE name = 'input_format_import_nested_json'┌─name────────────────────────────┬─value─┐
│ input_format_import_nested_json │ 0 │
└─────────────────────────────────┴───────┘INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}}Code: 117. DB::Exception: Unknown field found while parsing JSONEachRow format: n: (at row 1)SET input_format_import_nested_json=1
INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}}
SELECT * FROM json_each_row_nested┌─n.s───────────┬─n.i────┐
│ ['abc','def'] │ [1,23] │
└───────────────┴────────┘إعدادات التنسيق
| الإعداد | الوصف | القيمة الافتراضية | ملاحظات |
|---|---|---|---|
input_format_import_nested_json |
ربط بيانات JSON المتداخلة بالجداول المتداخلة (يعمل مع format JSONEachRow). | false |
|
input_format_json_read_bools_as_numbers |
السماح بتحليل القيم المنطقية كأرقام في JSON input formats. | true |
|
input_format_json_read_bools_as_strings |
يسمح بتحليل القيم المنطقية كسلاسل نصية في تنسيقات إدخال JSON. | true |
|
input_format_json_read_numbers_as_strings |
يسمح بتحليل الأرقام كسلاسل نصية في تنسيقات إدخال JSON. | true |
|
input_format_json_read_arrays_as_strings |
يسمح بتحليل مصفوفات JSON كسلاسل نصية في تنسيقات إدخال JSON. | true |
|
input_format_json_read_objects_as_strings |
السماح بتحليل كائنات JSON كسلاسل نصية في تنسيقات إدخال JSON. | true |
|
input_format_json_named_tuples_as_objects |
تحليل أعمدة named tuple على أنها كائنات JSON. | true |
|
input_format_json_try_infer_numbers_from_strings |
محاولة استنتاج الأرقام من الحقول النصية أثناء استنتاج المخطط. | false |
|
input_format_json_try_infer_named_tuples_from_objects |
حاوِل استنتاج Tuple مُسمّى من كائنات JSON أثناء استدلال المخطط. | true |
|
input_format_json_infer_incomplete_types_as_strings |
استخدم النوع String للمفاتيح التي لا تحتوي إلا على قيم NULL أو كائنات/مصفوفات فارغة أثناء استدلال المخطط في تنسيقات إدخال JSON. | true |
|
input_format_json_defaults_for_missing_elements_in_named_tuple |
أدرِج قيماً افتراضية للعناصر المفقودة في كائن JSON أثناء تحليل Tuple مُسمّى. | true |
|
input_format_json_ignore_unknown_keys_in_named_tuple |
تجاهل المفاتيح غير المعروفة في كائن JSON لـ Tuples المسماة. | false |
|
input_format_json_compact_allow_variable_number_of_columns |
السماح بعدد متغيّر من الأعمدة في تنسيق JSONCompact/JSONCompactEachRow، مع تجاهل الأعمدة الإضافية واستخدام القيم الافتراضية للأعمدة المفقودة. | false |
|
input_format_json_throw_on_bad_escape_sequence |
طرح استثناء إذا كانت سلسلة JSON تحتوي على تسلسل هروب غير صالح. وإذا كان هذا الخيار معطّلًا، فستبقى تسلسلات الهروب غير الصالحة كما هي في البيانات. | true |
|
input_format_json_empty_as_default |
اعتبار الحقول الفارغة في إدخال JSON قيماً افتراضية. | false. |
للتعبيرات الافتراضية المعقدة، يجب أيضًا تمكين input_format_defaults_for_omitted_fields. |
output_format_json_quote_64bit_integers |
يتحكم في quoting الأعداد الصحيحة ذات 64 بت في تنسيق إخراج JSON. | true |
|
output_format_json_quote_64bit_floats |
يتحكم في quoting الأعداد ذات الفاصلة العائمة 64 بت في تنسيق إخراج JSON. | false |
|
output_format_json_quote_denormals |
يُتيح إخراج '+nan' و'-nan' و'+inf' و'-inf' في تنسيق إخراج JSON. | false |
|
output_format_json_quote_decimals |
يتحكم في وضع القيم العشرية بين علامتَي اقتباس في تنسيق إخراج JSON. | false |
|
output_format_json_escape_forward_slashes |
يتحكم في إفلات الشرطات المائلة للأمام في مخرجات السلاسل النصية ضمن تنسيق إخراج JSON. | true |
|
output_format_json_named_tuples_as_objects |
إجراء تسلسل لأعمدة named tuple ككائنات JSON. | true |
|
output_format_json_array_of_rows |
إخراج مصفوفة JSON تضم جميع الصفوف بتنسيق JSONEachRow(Compact). | false |
|
output_format_json_validate_utf8 |
يُمكّن من التحقق من تسلسلات UTF-8 في تنسيقات إخراج JSON (لاحظ أن هذا لا يؤثر في التنسيقات JSON/JSONCompact/JSONColumnsWithMetadata، إذ إنها تتحقق دائمًا من UTF-8). | false |