TSV بـ CSV في وسائط التنسيق.
أثناء اتباع هذا الدليل، ستقوم بما يلي:
- الاستكشاف: الاستعلام عن بنية ملف TSV ومحتواه.
- تحديد مخطط ClickHouse المستهدف: اختيار أنواع البيانات المناسبة وربط البيانات الحالية بهذه الأنواع.
- إنشاء جدول ClickHouse.
- المعالجة المسبقة للبيانات وبثّها إلى ClickHouse.
- تشغيل بعض الاستعلامات على ClickHouse.
المتطلبات الأساسية
- نزّل مجموعة البيانات بزيارة صفحة NYPD Complaint Data Current (Year To Date)، ثم انقر على زر Export واختر TSV for Excel.
- ثبّت ClickHouse server والعميل
ملاحظة حول الأوامر الموضَّحة في هذا الدليل
- بعض الأوامر تستعلم من ملفات TSV، وتُشغَّل من موجّه الأوامر.
- أما بقية الأوامر فتستعلم من ClickHouse، وتُشغَّل في
clickhouse-clientأو في واجهة Play UI.
تفترض الأمثلة في هذا الدليل أنك حفظت ملف TSV في
${HOME}/NYPD_Complaint_Data_Current__Year_To_Date_.tsv، لذا يُرجى تعديل الأوامر عند الحاجة.تعرّف على ملف TSV
اطّلع على الحقول في ملف TSV المصدر
Query
clickhouse-local لإجراء استعلام على البيانات الموجودة في ملف TSV الذي نزّلته.
Query
Response
Nullable(Float64)، وجميع الحقول الأخرى هي Nullable(String). وعند إنشاء جدول ClickHouse لتخزين البيانات، يمكنك تحديد أنواع أكثر ملاءمة وأفضل أداءً.
حدِّد المخطط المناسب
JURISDICTION_CODE ذو قيمة رقمية: هل ينبغي أن يكون UInt8، أم Enum، أم أن Float64 هو الأنسب؟
Query
Response
query أن JURISDICTION_CODE مناسب جدًا لـ UInt8.
وبالمثل، انظر إلى بعض حقول String وتحقق مما إذا كانت أنسب لأن تكون من نوع DateTime أو LowCardinality(String).
على سبيل المثال، يُوصَف الحقل PARKS_NM بأنه “اسم حديقة أو ساحة لعب أو مساحة خضراء في مدينة نيويورك مرتبطة بالواقعة، إن وُجدت (ولا تشمل حدائق الولاية)”. وقد تكون أسماء الحدائق في مدينة نيويورك مرشحًا جيدًا لـ LowCardinality(String):
Query
Response
Query
Response
PARK_NM. وهذا عدد قليل وفقًا لتوصية LowCardinality بأن يبقى عدد السلاسل النصية المميزة في الحقل LowCardinality(String) دون 10,000.
حقول DateTime
CMPLNT_FR_DT وCMPLT_TO_DT فكرة عمّا إذا كانت هذه الحقول تُملأ دائمًا أم لا:
Query
Response
Query
Response
Query
Response
Query
Response
ضع خطة
- يجب إجراء cast لـ
JURISDICTION_CODEإلىUInt8. - يجب إجراء cast لـ
PARKS_NMإلىLowCardinality(String) - يتم دائمًا ملء
CMPLNT_FR_DTوCMPLNT_FR_TM(وربما بوقت افتراضي هو00:00:00) - قد يكون
CMPLNT_TO_DTوCMPLNT_TO_TMفارغين - تُخزَّن التواريخ والأوقات في حقول منفصلة في المصدر
- التواريخ بالتنسيق
mm/dd/yyyy - الأوقات بالتنسيق
hh:mm:ss - يمكن دمج التواريخ والأوقات في أنواع DateTime
- توجد بعض التواريخ السابقة لـ 1 يناير 1970، ما يعني أننا بحاجة إلى DateTime 64 بت
هناك تغييرات أخرى كثيرة يجب إجراؤها على الأنواع، ويمكن تحديدها كلها باتباع خطوات الاستقصاء نفسها. انظر إلى عدد السلاسل النصية المميزة في الحقل، وإلى الحدين الأدنى والأقصى للقيم العددية، ثم اتخذ قراراتك. يحتوي مخطط الجدول الوارد لاحقًا في الدليل على كثير من السلاسل النصية منخفضة الكاردينالية وحقول الأعداد الصحيحة غير الموقعة، وعدد قليل جدًا من القيم العددية ذات الفاصلة العائمة.
دمج حقلي التاريخ والوقت
CMPLNT_FR_DT وCMPLNT_FR_TM في قيمة String واحدة يمكن تحويلها إلى DateTime، حدِّد الحقلين مع ربطهما بعامل الدمج: CMPLNT_FR_DT || ' ' || CMPLNT_FR_TM. ويُتعامل مع الحقلين CMPLNT_TO_DT وCMPLNT_TO_TM بالطريقة نفسها.
Query
Response
حوِّل String الخاص بالتاريخ والوقت إلى النوع DateTime64
MM/DD/YYYY إلى التنسيق YYYY/MM/DD. ويمكن تنفيذ الأمرين معًا باستخدام parseDateTime64BestEffort().
Query
DateTime64. ونظرًا لأن وقت انتهاء الشكوى ليس مضمونًا وجوده، يُستخدم parseDateTime64BestEffortOrNull.
Response
التواريخ المعروضة أعلاه على أنها
1925 ناتجة عن أخطاء في البيانات. توجد عدة سجلات في البيانات الأصلية تحمل تواريخ في السنوات 1019 - 1022، بينما يُفترض أن تكون 2019 - 2022. ويجري تخزينها على أنها 1 يناير 1925، لأنه أقدم تاريخ يدعمه DateTime بسعة 64 بت.إنشاء جدول
ORDER BY وPRIMARY KEY المستخدمين في الجدول. يجب تحديد
واحد على الأقل من ORDER BY أو PRIMARY KEY. فيما يلي بعض الإرشادات لتحديد
الأعمدة التي ينبغي تضمينها في ORDER BY، وستجد مزيدًا من المعلومات في قسم الخطوات التالية في نهاية
هذا المستند.
عبارتا ORDER BY وPRIMARY KEY
- يجب أن يتضمن الـ tuple الخاص بـ
ORDER BYالحقولَ المستخدمة في عوامل تصفية الاستعلام - لتحقيق أقصى ضغط على القرص، يجب ترتيب الـ tuple الخاص بـ
ORDER BYحسب الكاردينالية تصاعديًا - إذا وُجد، فيجب أن يكون الـ tuple الخاص بـ
PRIMARY KEYمجموعة فرعية من الـ tuple الخاص بـORDER BY - إذا جرى تحديد
ORDER BYفقط، فسيُستخدم الـ tuple نفسه بوصفهPRIMARY KEY - يُنشأ فهرس المفتاح الأساسي باستخدام الـ tuple الخاص بـ
PRIMARY KEYإذا كان محددًا، وإلا فباستخدام الـ tuple الخاص بـORDER BY - يُحتفَظ بفهرس
PRIMARY KEYفي الذاكرة الرئيسية
ORDER BY:
الاستعلام عن ملف TSV لمعرفة الكاردينالية للأعمدة الثلاثة المرشحة:
Query
Response
ORDER BY كما يلي:
سيستخدم الجدول أدناه أسماء أعمدة أسهل قراءةً، وستُطابَق الأسماء الواردة أعلاه مع
ORDER BY، نحصل على بنية الجدول التالية:
العثور على المفتاح الأساسي لجدول ما
system في ClickHouse، وتحديدًا system.table، على جميع المعلومات المتعلقة بالجدول الذي
أنشأته للتو. يوضّح هذا الاستعلام ORDER BY (مفتاح الترتيب)، وPRIMARY KEY:
المعالجة المسبقة واستيراد البيانات
clickhouse-local لإجراء المعالجة المسبقة للبيانات، وclickhouse-client لتحميلها.
وسائط clickhouse-local المستخدمة
تحقّق من البيانات
تتغير مجموعة البيانات مرة واحدة أو أكثر سنويًا، لذا قد لا تتطابق أعدادك مع ما يرد في هذا المستند.
Query
Response
Query
Response
نفّذ بعض الاستعلامات
الاستعلام 1. قارن عدد الشكاوى حسب الأشهر
Query
Response
الاستعلام 2. قارن إجمالي عدد الشكاوى حسب البورو
Query
Response