TabPy للعمل مع البيانات في ClickHouse من Tableau

بناء التواصل بين العلامات التجارية والأفراد هو ما نقوم به في Dentsu Aegis Network يوميًا ، وتحليل البيانات جزء لا يتجزأ من هذا العمل. في بعض الحالات ، لا تتطلب هذه العملية علم البيانات (على الرغم من أن لدينا واحدة) ، ثم نستخدم منصة Tableau BI. هدفها الرئيسي هو إعطاء موظفينا وعملائنا واجهة مريحة لاستهلاك البيانات دون كتابة البرامج النصية واستعلامات SQL ، إلخ.

في هذه المقالة ، سنصف كيف تمكنا من حل مشكلة تفاعل Tableau مع ClickHouse .

بيان عام للمشكلة


واجهنا تحديا كلاسيكيا. لدينا أناس. انهم يحبون الفاكهة. بعض الناس يحبون فاكهة واحدة ، وبعضها مثل جميع الفواكه ، والباقي يمكن أن يحب أي مزيج من الفواكه.
صورة
لذلك ، من الضروري تمكين المستخدم في لوحة المعلومات المضمنة في Tableau من اختيار العديد من الفواكه بشكل تعسفي ومعرفة عدد الأشخاص الذين يحبون فاكهة واحدة على الأقل من المجموعة. بالطبع ، لم يكن لدينا ثمار ، لكن الناس كانوا حقيقيين ، إنه لفهم المشكلة ببساطة على "الثمار".

كمية البيانات في حالتنا كبيرة جدا. كان هناك 13 ألف "ثمار" مختلفة. وكان أكثر "شعبية" شعبية ما يقرب من 34 مليون معجب. في المتوسط ​​، يحب 450 ألف شخص كل "فاكهة". مجموع عشاق الفاكهة - 282 مليون.

حل الجبهة الأولى


لقد حدث أن بيانات هذه المهمة التي أجريناها في PostgreSQL (PG) و ClickHouse (CH). في PG كان هناك جدول مرجعي حول "ثمار" ، في CH - طاولة كبيرة مع هيكل: معرف "الفاكهة" ومعرف الشخص الذي يحب هذه "الفاكهة". لا يوجد موصل أصلي لـ CH في Tableau ، وما زلت لا أريد نقل البيانات في مكان ما ، لأن هذا سيتطلب إعادة صياغة خطيرة للنظام الحالي.

حاولنا توصيل Tableau بـ CH باستخدام برنامج تشغيل ODBC ومعرفة ما يحدث.

  • ليست كل برامج تشغيل ODBC مفيدة على قدم المساواة. نحتاج إلى إصدار معين يعمل فيه الجزء الضروري من الوظيفة ، لكن لا يوجد ضمان بأن يعمل الباقي إذا كنت بحاجة إليه فجأة.
  • لم نتمكن من سحب جميع البيانات في استخراج Tableau ، لأنه يحتوي على 13000 * 450،000 = 5،850،000،000 سجل.

ثم قررنا استخدام أخذ العينات داخل الاستعلام إلى قاعدة بيانات CH ، أي لجعل تقديرنا لعدد المعجبين بالمجموعة المختارة من "ثمار" ليس على جميع الناس ، ولكن على عينة خمسة في المئة لجعل استخراج أصغر. بالإضافة إلى ذلك ، قمنا على الفور بجلب رابط داخلي من CH مع دليل PG "fruit" للحصول على أسماء "fruit". لقد ساعد - تم استخراج مستخلصنا خلال 5 ساعات.

نحتاج إلى تحديث البيانات في لوحة المعلومات مرة واحدة يوميًا ، لذا يبدو أن 5 ساعات من تحديث الخلاصة على ما يرام - سنقوم بالتحديث في الليل. لكننا في المستقبل سنحتاج إلى قدرات إضافية: يجب أن يكون هناك "ثمار" أكثر ؛ وبناءً على ذلك ، يجب أيضًا زيادة عدد وحجم مجموعات الأشخاص الذين نحتاج إلى حساب تقاطعهم. لذلك ، فإن التحديث الطويل للمستخلص ليس على الإطلاق خيارنا.

بالإضافة إلى ذلك ، كانت هناك مشكلة أخرى بسبب أخذ العينات. لقد حدث أنه في أجزاء مختلفة من لوحة القيادة كانت الأرقام ، والتي من المفترض أن تتزامن ، مختلفة في بلدنا. كان هذا بسبب حقيقة أننا في مكان واحد عدنا عدد عشاق فاكهة واحدة بدقة ، وجزئياً مع مزيج من الفواكه - غير دقيق. لم نحب نحن ولا مستخدمينا هذه النتيجة.

ثم قررنا عدم إنشاء استخراج على الإطلاق. لتجنب تحميل كمية كبيرة من البيانات ، قمنا بتقسيم مجموعات البيانات واستخدمنا الاتصال المباشر لـ CH. بين مجموعات البيانات ، تم إنشاء اتصال باستخدام وظيفة علاقة Tableau Edit المدمجة. تم جعل مصدر بيانات PG أساسيًا وربطه بـ CH باعتباره ثانويًا ، باستخدام معرف "الفاكهة" الموجود في كلا الجدولين.

وبالتالي ، تمكنا من تصفية مصدر البيانات الثانوي باستخدام الأساسي (مزج البيانات). لكننا كنا نتوقع الفشل ، لأنه بعد إلقاء عامل التصفية من مصدر بيانات إلى آخر ، كان علينا استخدام وظيفة عد الأشخاص في المجموعة الفرعية الناتجة (COUNTD) ، ومزج البيانات له قيود لا تسمح ببساطة بإجراء ذلك. مثل هذه الوظيفة مباشرة مع اتصال البيانات هذا لا يعمل من حيث المبدأ.

هناك حل بديل يساعد على التحايل على قيود Tableau ، ولكن يمكن استخدامه في مجموعات البيانات الصغيرة نسبيًا ، وهذا ليس هو الحال بوضوح في حالتنا.

بعد ذلك ، جربنا خيارًا آخر. لا تزال مجموعات البيانات منقسمة وتستخدم اتصال مباشر لـ CH. هنا ، تم إلقاء مرشح من مجموعة البيانات مع وصف "الفواكه" إلى مجموعة البيانات مع المعجبين ب "الفواكه" داخل Tableau باستخدام مجموعة الحركة. لكن هذا الخيار لم يصلح في النهاية بسبب واجهة المستخدم غير المريحة. بدلاً من المرشح المألوف لدى المستخدم ، سيتعين على المستخدم إلقاء نظرة على القائمة بأكملها وتحديد "ثمار" عبر cntrl + click ، ​​في حين كانت وظيفة التطبيق غائبة عندما يتم تطبيق جميع القيم المحددة مرة واحدة.

نتيجةً لذلك ، بعد كل محاولاتنا ، اضطررنا للعودة إلى الخيار مع الاستخراج والعينة ، بطيئًا بشكل رهيب ولم نعط سوى إجابة تقريبية.

صورة

وجدت الحل


من الواضح ، لسنا بحاجة لسحب جميع البيانات إلى استخراج Tableau. المستخدم غير مرتاح لرؤية جميع البيانات في وقت واحد - عدد الأشخاص الذين يحبون جميع "الفواكه". إنه يحتاج إلى مجموعة من متوسط ​​10 "ثمار". إنه لأمر مؤسف أن Tableau لا يعرف كيفية القيام بذلك.

هناك شباب في فريقنا يكتبون في بيثون. لذلك ، قررنا في بحثنا التحرك في هذا الاتجاه ووجدنا TabPy .

TabPy هي خدمة ويب تتيح لك الحصول على نتيجة تنفيذ البرامج النصية لـ Python داخل التكلفة في Tableau.

كيف يعمل:

  1. يتفاعل Tableau مع TabPy ، وبدوره ، مع بيثون باستخدام وظائف البرنامج النصي المزعومة. تحتوي وظائف البرنامج النصي على البرنامج النصي Python نفسه ، ونوع البيانات المطلوب للنتيجة ، والحجج التي نمررها إلى هذه الوظيفة. في حالتنا ، كانت الحجج عبارة عن معرفات لـ "ثمار" ، عدد عشاقها الذين أردنا حسابهم.
  2. يقوم TabPy بتحويل نص وظائف البرنامج النصي المستلم إلى برنامج نصي ويمرره إلى المترجم. تم تسجيل الاتصال بقاعدة CH من قبلنا داخل البرنامج النصي.
  3. بعد ذلك ، إرجاع TabPy نتيجة البرنامج النصي الذي تم تنفيذه مرة أخرى إلى Tableau.


صورة

في وظائف البرنامج النصي ، يتم دائمًا تمرير الوسائط كصفائف ؛ ويتم أيضًا إرجاع النتيجة بواسطة صفيف.

ليس كل شيء يعمل على الفور. الشيء الرئيسي الذي فهمناه: كتابة نص بيثون مباشرة في حقل محسوب في تابلوه ليس فكرة جيدة. لسببين:

  1. داخل وظائف البرنامج النصي ، يكون من الصعب أحيانًا استخدام بناء جملة Python المألوف. على سبيل المثال ، لا يتم قبول عروض الأسعار المتعددة.
  2. بالتفكير في الدعم المستقبلي للوحة القيادة ، أدركنا أننا إذا كنا بحاجة إلى تغيير البرنامج النصي بطريقة أو بأخرى ، في كل مرة يتعين علينا تغييره في كتاب Tableau نفسه. ومن الواضح أن هذه ليست أفضل طريقة ، لأننا نبذل قصارى جهدنا لتجنب الدعم اليدوي للوحات المعلومات.

لذلك ، استخدمنا شيئًا آخر - عميل TabPy .

عميل TabPy هو مكتبة تتيح لك نشر برامج Python النصية على خادم TabPy ثم الاتصال بها داخل Tableau. عند استخدامه ، بدلاً من كتابة برنامج نصي داخل Tableau ، ندعو ملف .py الموجود على خادم TabPy باستخدام المعلمات المحددة فيه ، وننقل الوسائط إليه ، وننفذه.

هذا النهج حل مشاكلنا باستخدام TabPy و Tableau. يتم كتابة البرنامج النصي واختباره في بيئة التطوير المألوفة وتخزينه بشكل منفصل عن الكتاب ، والذي لا يحتاج الآن إلى دعم يدوي.

لحل مشكلتنا المحددة ، كان علينا القيام بما يلي.
في البداية حاولنا حلها دون استخدام عميل TabPy. في هذه الحالة ، تم إنشاء حقل حساب من النموذج التالي داخل Tableau:
إذا كانت الأولى () == 0
THEN
SCRIPT_INT ("
من clickhouse_driver استيراد عميل
client = Client (host = host_name ، قاعدة البيانات = database_name ، المستخدم = user_name ، كلمة المرور = password)

----- script_text -----

"، SUM ([الأشخاص]) ، ATTR ([fruit_id]))
END
نجحت ، ولكن كانت هناك مشاكل تم وصفها أعلاه. عندما اكتشفنا عميل TabPy ، أدركنا أنه بتقسيم حقل الحساب والبرنامج النصي نفسه ، نحصل على نظام أكثر ملاءمة وصحيحًا. هذه هي الطريقة التي يبدو بها حقل الحساب وملف .py بالبرنامج النصي:
مجال الحسابSCRIPT_INT ("
عرض tabpy.query ('people_count_test' ، _ arg1 ، _arg2) ['استجابة']
"، SUM ([الأشخاص]) ، ATTR ([fruit_id]))
ملف .Pyمن clickhouse_driver استيراد عميل
استيراد tabpy_client
اتصال = tabpy_client.Client ('http: // localhost: 9004 /')
def unique_people_count (الأشخاص ، fruit_id):
client = Client (host = host_name ، قاعدة البيانات = database_name ، المستخدم = user_name ، كلمة المرور = password)

----- script_text -----

connection.deploy ('people_count_test' ، unique_people_count ، 'comment' ، override = True)
هنا يمكنك أن ترى أن "people_count_test" هو المعرف لعميل TabPy ، وبفضله من الواضح ما هو النص الذي سيتم تنفيذه في حقل الحساب هذا.

وفي النهاية ، كان هذا النهج هو ما يرضينا تمامًا.

صورة

يؤدي


يشعر المستخدمون بالرضا لأنه يمكنهم اختيار مجموعة من "الفواكه" بشكل تعسفي والحصول بسرعة على عدد المعجبين بواحد منهم على الأقل ، والأرقام في أجزاء مختلفة من لوحة القيادة هي نفسها.

يسعد مطورو BI أنه يمكنك العمل مع ClickHouse من Tableau ، دون الحاجة إلى الاتصال به مباشرة.

يسر خادم Tableau الخاص بنا أنك لست بحاجة إلى عمل خلاصة ضخمة في الليل.

بشكل عام ، يتيح TabPy لمطوري BI حرية أكبر في التعامل مع البيانات عندما لا يكون لدى Tableau حلاً مناسبًا خارج الصندوق. على سبيل المثال ، لتضمين نماذج لعلوم البيانات مباشرةً في تابلوه ، ولكن هذه قصة أخرى تمامًا ...

كُتب هذا المقال بالاشتراك مع زملائي ديميتري شيربينكو ( dima_vs ) وسوخوفيف إيفان ( suho_v ) R&D Dentsu Aegis Network Russia.

Source: https://habr.com/ru/post/ar477864/


All Articles