Membangun komunikasi antara merek dan orang adalah apa yang kami di Dentsu Aegis Network lakukan setiap hari, dan analisis data merupakan bagian integral dari pekerjaan ini. Dalam beberapa kasus, proses ini tidak memerlukan ilmu data (meskipun kami memilikinya), maka kami menggunakan platform
Tableau BI. Tujuan utamanya adalah untuk memberikan antarmuka yang nyaman bagi karyawan dan pelanggan kami untuk mengonsumsi data tanpa menulis skrip, kueri SQL, dll.
Pada artikel ini, kami akan menjelaskan bagaimana kami berhasil menyelesaikan masalah Tableau berinteraksi dengan
ClickHouse .
Pernyataan umum masalah
Kami menghadapi tantangan klasik. Kami punya banyak orang. Mereka suka buah. Beberapa orang menyukai satu buah, beberapa menyukai semua buah, dan sisanya dapat menyukai kombinasi buah apa pun.

Jadi, perlu untuk memungkinkan pengguna di dashboard yang dibangun di Tableau untuk secara acak memilih beberapa buah dan melihat berapa banyak orang menyukai setidaknya satu buah dari set. Tentu saja, kami tidak memiliki buah, tetapi orang-orang nyata, hanya saja pada "buah" lebih mudah untuk memahami masalahnya.
Jumlah data dalam kasus kami cukup besar. Ada 13 ribu "buah" yang berbeda. "Buah" paling populer memiliki hampir 34 juta penggemar. Rata-rata, 450 ribu orang saling mencintai “buah”. Total pecinta buah - 282 juta.
Solusi dahi pertama
Kebetulan data untuk tugas ini kami miliki di
PostgreSQL (PG) dan di ClickHouse (CH). Di PG ada tabel referensi tentang "buah-buahan", di CH - meja besar dengan struktur: pengidentifikasi "buah" dan pengidentifikasi orang yang menyukai "buah" ini. Tidak ada konektor asli untuk CH di Tableau, dan saya masih tidak ingin mentransfer data di suatu tempat, karena ini akan membutuhkan pengerjaan ulang yang serius dari sistem yang ada.
Kami mencoba menghubungkan Tableau ke CH menggunakan driver ODBC dan melihat apa yang terjadi.
- Tidak semua driver ODBC sama-sama bermanfaat. Kami memerlukan versi tertentu di mana bagian yang diperlukan dari fungsi berfungsi, tetapi tidak ada jaminan bahwa sisanya akan berfungsi jika Anda tiba-tiba membutuhkannya.
- Kami tidak dapat menarik semua data ke ekstrak Tableau, karena itu 13.000 * 450.000 = 5.850.000.000 catatan.
Selanjutnya, kami memutuskan untuk menggunakan sampel di dalam kueri ke database CH, yaitu, untuk membuat estimasi jumlah pecinta dari kombinasi "buah" yang dipilih tidak pada semua orang, tetapi pada sampel lima persen untuk membuat ekstrak lebih kecil. Selain itu, kami segera membuat penggabung dalam mengambil dari CH dengan direktori "buah" PG untuk mendapatkan nama "buah". Ini membantu - ekstrak kami dapat dihasilkan dalam 5 jam.
Kami perlu memperbarui data di dasbor sekali sehari, jadi 5 jam memperbarui ekstrak tampaknya baik-baik saja - kami akan memperbarui di malam hari. Tetapi di masa depan kita akan membutuhkan kapasitas tambahan: harus ada lebih banyak "buah-buahan", sehingga jumlah dan ukuran kelompok orang yang persimpangan kita perlu hitung juga harus meningkat. Karena itu, pembaruan ekstrak yang lama sama sekali bukan pilihan kami.
Selain itu, ada masalah lain karena pengambilan sampel. Kebetulan di bagian dashboard yang berbeda angkanya, yang seharusnya bertepatan, berbeda di negara kita. Ini disebabkan oleh fakta bahwa di satu tempat kami menghitung jumlah pecinta satu buah secara akurat, dan sebagian dengan kombinasi buah-buahan - tidak akurat. Kami maupun pengguna kami tidak menyukai hasil ini.
Kemudian kami memutuskan untuk tidak membuat ekstrak sama sekali. Untuk menghindari memuat sejumlah besar data, kami membagi dataset dan menggunakan koneksi langsung untuk CH. Di antara set data, koneksi dibuat menggunakan fungsionalitas hubungan Tableau Edit bawaan. Sumber data PG dibuat primer dan dihubungkan ke CH sebagai sekunder, menggunakan pengidentifikasi "buah" yang ada di kedua tabel.
Dengan demikian, kami dapat memfilter sumber data sekunder menggunakan primer (Pencampuran data). Tapi kami mengharapkan kegagalan, karena setelah membuang filter dari satu sumber data ke yang lain, kami harus menggunakan fungsi penghitungan orang di subset yang dihasilkan (COUNTD), dan pencampuran data memiliki batasan yang tidak memungkinkan untuk dilakukan. Fungsi seperti itu secara langsung dengan koneksi data seperti itu pada prinsipnya tidak bekerja.
Ada solusi yang membantu menghindari batasan Tableau ini, tetapi dapat digunakan pada kumpulan data yang relatif kecil, yang jelas tidak demikian dalam kasus kami.
Setelah itu, kami mencoba opsi lain. Kumpulan data masih terbagi dan menggunakan koneksi langsung untuk CH. Di sini, filter dari dataset dengan deskripsi "buah" ke dataset dengan penggemar "buah" dilemparkan ke dalam Tableau menggunakan aksi set. Tetapi opsi ini pada akhirnya tidak cocok karena UI yang tidak nyaman. Alih-alih filter yang akrab bagi pengguna, pengguna harus melihat seluruh daftar dan memilih "buah-buahan" melalui cntrl + klik, sedangkan fungsi yang berlaku tidak ada ketika semua nilai yang dipilih diterapkan sekaligus.
Akibatnya, setelah semua upaya kami, kami harus kembali ke opsi dengan ekstrak dan pengambilan sampel, sangat lambat dan hanya memberikan jawaban perkiraan.

Solusi ditemukan
Jelas, kami tidak perlu menarik semua data ke ekstrak Tableau. Pengguna tidak nyaman untuk melihat semua data sekaligus - jumlah orang yang menyukai semua "buah". Dia membutuhkan satu set rata-rata 10 buah. Sangat disayangkan Tableau tidak tahu bagaimana melakukan ini.
Ada orang-orang di tim kami yang menulis dengan Python. Oleh karena itu, kami memutuskan dalam pencarian kami untuk bergerak ke arah ini dan menemukan
TabPy .
TabPy adalah layanan web yang memungkinkan Anda untuk mendapatkan hasil mengeksekusi skrip Python di dalam penetapan biaya di Tableau.
Cara kerjanya:
- Tableau berinteraksi dengan TabPy dan, pada gilirannya, dengan Python menggunakan apa yang disebut dengan Script Functions. Script Functions berisi skrip Python itu sendiri, tipe data hasil yang diperlukan, dan argumen yang kami sampaikan ke fungsi ini. Dalam kasus kami, argumennya adalah pengidentifikasi "buah-buahan", jumlah pecinta yang ingin kami hitung.
- TabPy mengonversi teks Fungsi Skrip yang diterima ke skrip dan meneruskannya ke penerjemah. Koneksi ke pangkalan CH didaftarkan oleh kami di dalam skrip.
- Selanjutnya, TabPy mengembalikan hasil dari skrip yang dieksekusi kembali ke Tableau.

Dalam Fungsi Skrip, argumen selalu dilewatkan sebagai array, hasilnya juga dikembalikan oleh array.
Tidak semuanya langsung bekerja. Hal utama yang kami mengerti: menulis skrip Python langsung di bidang terhitung di Tableau bukanlah ide yang baik. Karena dua alasan:
- Di dalam Fungsi Script, terkadang sulit untuk menggunakan sintaks Python yang sudah dikenal. Misalnya, beberapa penawaran tidak diterima.
- Berpikir tentang dukungan di masa depan untuk dasbor, kami menyadari bahwa jika kami perlu mengubah skrip, maka setiap kali kami harus mengubahnya di buku Tableau itu sendiri. Dan ini jelas bukan cara terbaik, karena kami melakukan yang terbaik untuk menghindari dukungan manual untuk dasbor.
Oleh karena itu, kami menggunakan hal lain -
Klien TabPy .
TabPy Client adalah pustaka yang memungkinkan Anda untuk mempublikasikan skrip Python di server TabPy dan kemudian memanggil mereka di dalam Tableau. Saat menggunakannya, alih-alih menulis skrip di dalam Tableau, kami memanggil file .py di server TabPy menggunakan parameter yang ditentukan di dalamnya, meneruskan argumen ke sana, dan menjalankannya.
Pendekatan ini memecahkan masalah kami menggunakan TabPy dan Tableau. Script ditulis dan diuji dalam lingkungan pengembangan yang sudah dikenal dan disimpan secara terpisah dari buku, yang sekarang tidak memerlukan dukungan manual.
Untuk menyelesaikan masalah khusus kami, kami harus melakukan yang berikut.
Pada awalnya kami mencoba menyelesaikannya tanpa menggunakan TabPy Client. Dalam hal ini, bidang Perhitungan bentuk berikut ini dibuat di dalam Tableau:
Itu berhasil, tetapi ada masalah yang dijelaskan di atas. Ketika kami menemukan TabPy Client, kami menyadari bahwa dengan membagi bidang Perhitungan dan skrip itu sendiri, kami mendapatkan sistem yang lebih nyaman dan benar. Begini tampilannya bidang dan file .py dengan skrip:
Di sini Anda dapat melihat bahwa 'people_count_test' adalah pengidentifikasi untuk Klien TabPy, karena itu jelas skrip mana yang harus dijalankan dalam bidang Perhitungan ini.
Dan pada akhirnya, pendekatan inilah yang benar-benar memuaskan kami.

Ringkasan
Pengguna puas karena mereka dapat secara sewenang-wenang memilih kombinasi "buah-buahan" dan dengan cepat mendapatkan jumlah penggemar setidaknya satu dari mereka, dan angka-angka di berbagai bagian dasbor adalah sama.
Pengembang BI senang bahwa Anda dapat bekerja dengan ClickHouse dari Tableau, tanpa harus terhubung secara langsung.
Tableau Server kami senang bahwa Anda tidak perlu membuat ekstrak besar di malam hari.
Secara umum, TabPy memberi pengembang BI lebih banyak kebebasan untuk bekerja dengan data ketika Tableau tidak memiliki solusi yang sesuai. Misalnya, untuk menanamkan model sains data secara langsung di Tableau, tapi itu cerita lain sama sekali ...
Artikel ini ditulis bersama dengan rekan-rekan saya Dimitri Shcherbenko (
dima_vs ) dan Sukhoveev Ivan (
suho_v ) R&D Dentsu Aegis Network Russia.