Pada awalnya, kami akan menjelaskan secara singkat seperti apa proses itu sebelum dan sesudah kami mengajarkan produk internal A1 kami untuk mengumpulkan sumber data secara terprogram dan mempublikasikannya ke Server Tableau. Kemudian kita akan melihat lebih dekat masalah perintah BI dan solusi yang ditemukan, dan juga melihat di balik terpal (di sini tentang membuat file .hyper, menerbitkan file di server tablo dan memperbarui hyper). Selamat datang di kucing!

Kami di grup periklanan DAN banyak bekerja dengan data pemantauan periklanan dari Mediascope , pengukur industri di pasar media. Ada beberapa skenario yang berbeda: beberapa karyawan mengunggah data mentah, yang lain menggunakan database siap pakai yang telah diproses sebelumnya, dan seseorang memesan pengembangan dasbor otomatis berdasarkan data ini. Mari kita bahas skenario terakhir secara lebih detail - pengembang BI kami mengumpulkan dasbor di Tableau, tetapi sebelum mulai "menggambar", mereka juga perlu membawa data ke format yang diinginkan agar sesuai untuk pengembangan.
Jalur hidup data dari bahan mentah hingga grafik otomatis yang indah secara kasar dapat dibagi menjadi 4 langkah:
- Mendapatkan data mentah
- Pembersihan dan revisi data
- Membuat sumber data untuk Tableau
- Pengembangan visualisasi
Dulu
Sebelum kita mempelajari cara menghasilkan sumber data secara terprogram untuk Tableau, prosesnya terlihat seperti ini:

1. Mendapatkan data mentah
Pengguna membuat laporan tabel melalui alat internal A1. Kami akan membicarakannya lebih detail di bawah.
2. Pembersihan dan revisi data
Kemampuan transformasi data juga disertakan dalam alat A1, setelah itu data yang dibersihkan dapat diunggah ke xslx / csv dan terus bekerja dengannya di luar alat. Perlu dicatat di sini bahwa beberapa pengguna membatasi diri mereka sendiri pada poin pertama dan, setelah mengunggah laporan, memodifikasi datanya sendiri.
3. Membuat sumber data untuk Tableau
Sebelumnya, pelanggan dasbor datang dengan satu set Excels, yang mereka hasilkan di paragraf sebelumnya. Dan pengembang BI membawa karya-karya tersebut ke dalam satu sumber data (bahasa gaul tabloid) sendiri. Tidak selalu mungkin untuk membatasi diri hanya pada alat Tableau; mereka sering menulis skrip dengan Python.
4. Pengembangan visualisasi
Akhirnya, puncak gunung es adalah membuat dasbor dan menerbitkannya di Server Tableau, di mana pelanggan dapat melihatnya. Dalam praktiknya, rendering sering kali membutuhkan lebih sedikit waktu daripada mengumpulkan data dan menyiapkan pembaruan.
Rasa sakit terakumulasi pada langkah ketiga, seiring dengan bertambahnya jumlah solusi khusus, yang mahal untuk dirawat dan diterapkan. Juga, kesalahan dalam data dari langkah kedua secara teratur bocor - Excel perantara antara dua sistem (A1 dan Tableau) mendorong pengguna: "mari kita perbaiki sesuatu dengan pena, tidak ada yang akan memperhatikan".
Telah menjadi
Tugas utamanya adalah menghilangkan bekas bulu antara 2 dan 3 langkah. Hasilnya, kami mengajar A1 untuk mengumpulkan sumber data dan menerbitkannya ke Server Tableau. Inilah yang terjadi:

Sekarang langkah 1 hingga 3 dilakukan di A1, pada keluaran tim BI menerima sumber data yang diterbitkan di Server Tableau untuk mengembangkan visualisasi. Hyper API menjadi link penghubung, yang akan dibahas lebih lanjut.
hasil
Mengurangi jumlah node saat bekerja dengan alat yang berbeda. Sekarang lebih sulit untuk membuat kesalahan di suatu tempat dalam prosesnya, dan lebih mudah untuk mengetahui di mana kesalahan itu terjadi, penyelidikan kegagalan membutuhkan lebih sedikit waktu. Sistem memperingatkan pengguna tentang kesalahan umum.
Bebaskan waktu tim BI . Sebelumnya, hanya ada sedikit solusi template dan banyak penyesuaian. Paling sering, pemrosesan dengan Python ditambahkan untuk setiap proyek. Dalam kasus yang jarang terjadi, di mana pemrosesan tidak diperlukan, kami bekerja langsung di Desktop Tableau (alat pengembangan utama).
Sekarang persiapan sumber data adalah: klik pada bidang yang diperlukan di antarmuka A1, tandai bidang yang mana yang akan kami kembangkan menjadi beberapa baris (jika perlu) dan tentukan jenis bidang terlebih dahulu secara opsional.
Kami tidak memuat Server Tableaumemperbarui sumber data besar - pembaruan dilakukan oleh A1, dan hyper yang sudah jadi diunduh ke server.
* Bonus - kami mendorong pengguna untuk bekerja di dalam A1. Jika sebelumnya beberapa pengguna, setelah membongkar laporan mentah, mengubahnya secara manual di luar alat, sekarang, karena seluruh proses dari langkah 1 hingga 3 berlangsung di A1, lebih mudah bagi pengguna untuk menyiapkan proses pembersihan di sana.
Masalah dan solusi
Sedikit tentang A1
Sebelum kita mulai berbicara tentang solusi kita, kita perlu berbicara tentang produk internal A1 kita, yang dengannya kita telah melampirkan pembuatan sumber data.
A1 merupakan produk internal perusahaan yang dirancang untuk mempermudah alur kerja bagi karyawan yang tugas utamanya adalah sebagai berikut:
- Ambil data dari produk perangkat lunak MediaScope
- Bawalah (bersihkan) data ini ke dalam bentuk yang nyaman bagi analis subjek
- Jika perlu, siapkan data untuk membuat dasbor (kita akan membicarakannya hari ini)
Setelah pengguna selesai membersihkan data, data tersebut disimpan di sistem A1. Dalam terminologi kami, ini disebut "Container". Kontainer adalah dokumen biasa di MongoDB, yang perlu kita transfer ke server Tableau.
Masalah tim BI
Tim pengembangan BI kami perlu mendapatkan data dari A1, yang disimpan di MongoDB, dan membuat dasbor berdasarkan data yang diterima. Pertama-tama, kami mencoba mengambil data dari MongoDB menggunakan alat papan skor biasa, tetapi ini tidak menyelesaikan masalah:
- Karena data disimpan di MongoDB, data dengan struktur arbitrer diterima di pintu masuk papan skor, yang berarti Anda harus terus-menerus mempertahankan logika ini.
- Untuk mengumpulkan data dari MongoDB, catatan tertentu perlu ditarik dari koleksi, dan bukan seluruh koleksi - driver Tableau tidak tahu cara melakukan ini.
- Antara lain, tidak cukup untuk mendapatkan data: terkadang harus "diperluas" - untuk "memisahkan" beberapa kolom menjadi baris. Yang juga tidak mudah dilakukan, dari kata sama sekali.
Apa yang telah kami hasilkan
Diputuskan untuk mencoba memecahkan masalah ini dengan sepeda saya, menggunakan pustaka Tableau Hyper API . Pustaka ini memungkinkan Anda untuk membuat file dalam format .hyper, yang memudahkan untuk menambahkan data, dan kemudian menggunakannya sebagai sumber data untuk membuat dasbor di papan server.
Saat para pengembang papan skor mendeskripsikan hiper itu sendiri:
Hyper adalah mesin data dalam memori berkinerja tinggi yang membantu pelanggan dengan cepat menganalisis kumpulan data yang besar atau kompleks dengan mengevaluasi kueri database secara efisien. Berdasarkan platform Tableau, Hyper menggunakan teknik pembuatan kode dinamis eksklusif dan teknologi konkurensi canggih untuk mencapai kinerja tinggi dalam ekstrak dan kueri.Perkiraan proses kerja dalam program kami adalah sebagai berikut:
- Pengguna memilih wadah dan kolom yang diinginkan
- Sistem menarik data dari kontainer
- Berdasarkan data yang diterima, sistem menentukan jenis kolom
- Pembuatan hyper dan penyisipan data ke dalamnya diinisialisasi
- Hyper dimuat di server papan skor
- Pengembang BI melihat hyper pada server dan membuat dasbor berdasarkan itu
Ketika data baru dituangkan ke dalam wadah, sistem akan diberi sinyal bahwa hyper perlu diperbarui:
- Sistem akan mengunduh hyper dari server papan skor
- Akan mengambil data baru dari MongoDB dan memperbarui hyper
- Setelah itu, sistem mengupload hyper baru ke server, menimpa hyper yang sudah ada.
- Pengguna hanya perlu mengklik tombol "Segarkan" untuk menampilkan informasi terbaru di dasbor
Apa yang dilihat pengguna
Seperti yang dinyatakan sebelumnya, A1 adalah aplikasi web. Kami menggunakan Vue.js dan Vuetify untuk membuat layanan generasi hiper front-end.
Antarmuka aplikasi dibagi menjadi tiga layar.
Di layar pertama, pengguna memilih wadah dan kolom yang diinginkan.
Jika opsi "Unpivot" diaktifkan, maka dua kolom tambahan akan dibuat di hyper: variabel - nama kolom yang dipilih oleh kolom dan nilai Metrik - nilai dari kolom ini.
Kolom Dimensi menambahkan kolom dengan kolom yang dipilih dengan nama yang sama ke hyper. Jumlah kolom yang dipilih Dimensi dan namanya harus sama di semua container agar integritas tabel di hyper tidak dilanggar, oleh karena itu ada kolom "Hyper name", yang memungkinkan Anda menentukan nama kolom yang dipilih, jika namanya berbeda di container.
Ini menyimpulkan proses pengaturan hyper. Pengguna hanya perlu pergi ke layar kedua, klik "Buat hyper" dan lihat kemajuan acara di log.
Layar ketiga berisi pengaturan tambahan:
- Anda dapat mengaktifkan mengabaikan pembaruan jika kami tidak memerlukan sistem untuk memperbarui hyper secara otomatis
- Anda dapat menentukan email untuk mengirim laporan pembaruan
- Anda dapat menentukan tipe data secara manual untuk kolom nilai (hanya digunakan dalam mode tidak berporos): float, string, atau ditentukan secara otomatis oleh sistem (kita akan membicarakan tipe lebih lanjut)
- Anda juga dapat menentukan tipe data untuk kolom yang dipilih dalam wadah.
Apa yang ada di bawah tenda
A1 ditulis dengan Python. Untuk bekerja dengan data, kami menggunakan Pandas, dan kami membuat serial data dari panda ke acar dan menyimpannya di MongoDB GridFS.
Ketika perintah untuk membuat hyper diterima, sistem akan melakukan operasi berikut:
- Bongkar semua kontainer yang diperlukan dari MongoDB dan deserialisasi data ke dalam bingkai data pandas
- Mempersiapkan data: menyisakan hanya kolom yang diperlukan dalam kerangka data, memberi mereka nama baru, memperluas tabel jika perlu melalui pandas.melt
- Jika pengguna telah menyetel tipe data untuk kolom, maka konversikan data menjadi float32 atau menjadi string
- Setelah semua pekerjaan persiapan dengan data, sistem membuat file melalui hyper api dan mengirimkan file ke server papan skor melalui tabcmd.
Ada baiknya berbicara sedikit tentang tipe data kolom. Salah satu fitur penyimpanan data dalam wadah A1 adalah bahwa pengguna tidak peduli tentang tipe apa yang harus ditetapkan ke kolom, panda melakukannya untuk mereka dengan sempurna: sistem dengan tenang mengatasi situasi ketika angka dan nilai string ada di kolom. Namun, hyper tidak menyukai ini: jika Anda memberitahunya bahwa kolom harus berjenis int, sistem akan bersumpah ketika mencoba memasukkan apa pun selain integer. Oleh karena itu, diputuskan untuk hanya menggunakan dua tipe data dalam hypers: string dan float.
Jadi, kami menemukan prinsip umum kerja, mari kita bicara tentang bekerja dengan hyper itu sendiri.
Membuat file .hyper
Untuk bekerja dengan Hyper API, Anda perlu menginstal library, Anda dapat mendownloadnya dari situs resminya di sini . Ada juga beberapa contoh bagus tentang cara bekerja dengan alat ini. Kami akan secara singkat menunjukkan poin utama.
File hyiper itu sendiri adalah sejenis database, agak mengingatkan pada SQLite. Melalui api, Anda dapat mengakses data menggunakan sintaks SQL seperti:
f"SELECT {escape_name('Customer ID')} FROM {escape_name('Customer')}"
Karena sistem kami dibuat dengan Python, kami juga akan menggunakan pustaka untuk bahasa yang sesuai. Saat membuat file, kita harus menentukan nama skema, nama tabel dan kolom dengan tipe. Nama skema dan tabel harus disebut "Ekstrak", karena dalam skema ini dengan tabel yang naik Tableau Server untuk mengekstrak data untuk buku.
with HyperProcess(Telemetry.SEND_USAGE_DATA_TO_TABLEAU) as hyper:
with Connection(
hyper.endpoint, self.fullpath_hyper, CreateMode.CREATE_AND_REPLACE
) as connection:
connection.catalog.create_schema("Extract")
main_table = TableName("Extract", "Extract")
example_table = TableDefinition(main_table)
Setelah membuat tabel, kita perlu membuat kolom dan mengatur tipe. Seperti yang kami katakan sebelumnya, data kami hanya memiliki dua jenis (float atau string), jadi berdasarkan jenis kolom di dataframe, kami menetapkan ini untuk kolom:
for column in dataframe.columns:
if dataframe[column].dtype.name in ("category", "object"):
example_table.add_column(TableDefinition.Column(column, SqlType.text()))
elif dataframe[column].dtype.name in ("float32"):
example_table.add_column(
TableDefinition.Column(column, SqlType.double())
)
connection.catalog.create_table(example_table)
Setelah membuat tabel, Anda dapat memasukkan data:
with Inserter(connection, example_table) as inserter:
for val in dataframe.values:
inserter.add_row(val.tolist())
inserter.execute()
Di sini kita menjalankan dataframe baris demi baris dan mengumpulkan daftar dengan nilai-nilai melalui inserter.add_row () . Sebenarnya, ada fungsi add_rows () di api hyper , yang mengambil daftar daftar dan sudah menyisipkan nilainya. Mengapa ini tidak dilakukan? Untuk menghemat RAM: untuk memberikan daftar daftar nilai dari dataframe, Anda perlu meminta panda untuk melakukan values.tolist () . Dan ketika Anda memiliki 150 juta baris data, ternyata itu adalah operasi yang sangat mahal untuk RAM, sementara ini tidak memengaruhi kinerja dengan cara apa pun (dalam hal apa pun, tidak diperhatikan bahwa karena iterasi berulang pada garis, kecepatan membuat hyper entah bagaimana tenggelam). Plus, tambahkan baris ()berfungsi seperti gula sintaksis: ini sebenarnya mengambil daftar daftar dan menambahkan data secara berulang.
Ini menyimpulkan pembuatan hyper kami. Selanjutnya, kita perlu mempublikasikannya di server.
Menerbitkan file ke server tablo
Untuk mengakses server tablo, kita akan menggunakan utilitas tabcmd - ini adalah utilitas konsol yang memungkinkan Anda terhubung ke server dan melakukan fungsi administratif - membuat pengguna, grup, buku, dan sebagainya.
Kami akan menjalankan perintah tabcmd melalui subproses Python.
popen = subprocess.Popen(
f'/opt/tableau/tabcmd/bin/tabcmd publish "{fullpath_hyper}" -n "{filename}" -o -r "A1_test" '
'-s http://tableau.domain.com -u "username" -p "password" --no-certcheck',
shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
)
return_code = popen.wait()
if return_code:
error = str(popen.communicate()[1])
return f" . {error}"
Kami meneruskan perintah dan kunci berikut ke tabcmd:
- publikasikan : unggah file ke server
- -n (--name) : nama file apa yang akan ada di server
- -o (--overwrite) : jika ada file dengan nama ini, maka timpa
- -r βA1_testβ (--project): ( )
- -s (--server): tableau-
- -u -p:
- --no-certcheck: SSL-
Kami menemukan cara membuat hyper baru, tetapi apa yang harus dilakukan jika hyper terdiri dari sepuluh container dan salah satunya menerima data baru? Kami akan memperbarui hyper.
Saat data baru tiba di penampung, sistem akan melihat apakah ada pengguna yang menggunakan penampung ini. Jika ada, maka tugasnya adalah memperbarui hyper.
Untuk memahami data apa dari penampung mana yang berada di hyper, sistem juga membuat kolom container_id tambahan saat membuat hyper. Dengan pendekatan ini, pembaruan menjadi sangat sederhana:
- Kami mengambil file dari server
- Kami menghapus semua baris di hyper, di mana container_id sama dengan container yang diperbarui
- Sisipkan baris baru
- Unggah file yang ditimpa kembali ke server.
Proses mengambil file sedikit berbeda dari proses mengunduhnya. Pertama-tama, kami tidak akan mengambil file .hyper dari server, tetapi arsip .tdsx, yang kemudian akan kami ekstrak dan buka .hyper itu sendiri.
Untuk mengambil file tersebut, kami menggunakan tabcmd:
popen = subprocess.Popen(
f'/opt/tableau/tabcmd/bin/tabcmd get "datasources/{filename_tdsx}" '
f'-s http://tableau.domain.com -u "username" -p "password" '
f'--no-certcheck -f "{fullpath_tdsx}"',
shell=True,
stderr=subprocess.PIPE,
stdout=subprocess.PIPE,
)
return_code = popen.wait()
if return_code:
error = str(popen.communicate()[1])
return f". {error}"
Di sini kami menggunakan perintah dan kunci berikut:
- get : dapatkan file dari server. Jika file test.hyper ada di server, maka Anda perlu merujuk ke file test.tdsx, dan semuanya ada di direktori sumber data (saya tidak bisa mencari di google mengapa fitur papan skor seperti itu, jika Anda tahu, bagikan di komentar)
- -f (--filename) : jalur lengkap, termasuk nama file dan ekstensi, tempat menyimpan file
Setelah file diunduh, itu harus diekstrak melalui zipfile:
with zipfile.ZipFile(fullpath_tdsx, "r") as zip_ref:
zip_ref.extractall(path)
Setelah mengekstrak, hyper akan berada di direktori ./Data/Extracts .
Sekarang kita memiliki versi file saat ini, kita dapat menghapus baris yang tidak perlu darinya:
table_name = TableName("Extract", "Extract")
with HyperProcess(Telemetry.SEND_USAGE_DATA_TO_TABLEAU) as hyper:
with Connection(hyper.endpoint, self.fullpath_hyper) as connection:
connection.execute_query(
f"DELETE FROM {table_name} WHERE "
f'{escape_name("container_id")}={container_id}'
).close()
Nah, memasukkan dan menerbitkan file sudah dijelaskan di atas.
Kesimpulan
Apa intinya? Setelah mengerjakan implementasi pembuatan hyper-file dan pengiriman otomatisnya ke tablo-server, kami secara signifikan mengurangi beban pada tim BI, menjadi lebih mudah untuk memperbarui data di dasbor dan, yang terpenting, lebih cepat. Sangat mengenal hyper api tidak menyakitkan, dokumentasinya ditulis dengan baik, dan integrasi teknologi ke dalam sistem kami sangat mudah.
Atas perhatiannya kami ucapkan terima kasih! Jika Anda memiliki pertanyaan atau komentar, silakan tinggalkan di komentar.
Artikel itu ditulis bersama dengan Vasily Lavrov (VasilyFromOpenSpace) β -