Saya memiliki beberapa snapshot dari database yang bukan jadwal waktu. Sebagai contoh:
Snapshot hari 1:
+----+---------------+------------+------------+ | ID | Title | Category | Date | +----+---------------+------------+------------+ | 1 | My First Post | helloworld | 2015-01-01 | +----+---------------+------------+------------+
Snapshot day 2 (Sebuah posting baru ditambahkan hari ini):
+----+----------------+------------+------------+ | ID | Title | Category | Date | +----+----------------+------------+------------+ | 1 | My first post | helloworld | 2015-01-01 | | 2 | My second post | other | 2015-01-02 | +----+----------------+------------+------------+
Snapshot day 3 (Post 2 dihapus hari ini):
+----+---------------+------------+------------+ | ID | Title | Category | Date | +----+---------------+------------+------------+ | 1 | My First Post | helloworld | 2015-01-01 | +----+---------------+------------+------------+
Jadi antara hari, deretan tabel mungkin atau tidak bisa konstan. Sekarang, saya harus dapat menggunakan kueri seperti ini:
SELECT category, COUNT(*) from day1.My_table group by category
Ini untuk satu meja sehari. Jika kita ingin menghitung rata-rata harian dari posting berdasarkan kategori dalam sebulan kita harus melakukan sesuatu seperti:
SELECT category, SUM(cnt) / 30
from (
SELECT category, COUNT(*) as cnt
from day1.My_table
group by category
UNION ALL SELECT category, COUNT(*) as cnt
from day2.My_table
group by category
UNION ALL ...
UNION ALL SELECT category, COUNT(*) as cnt
from day30.My_table
group by category
) group by category
Contoh lain, jumlah posting yang diterbitkan dalam sebulan :
SELECT COUNT(distinct id)
from (
SELECT id
from day1.My_table
UNION ALL ...
UNION ALL SELECT id
from day30.My_table
)
Pada dasarnya kita perlu mempertimbangkan bobot. Jika kita memiliki day1.My_table dan day5.My_table, setiap pos yang ada di day1 dan bukan di day5 akan dihitung seperti di hari ke 2,3,4. Setiap posting yaitu day1 dan day5 akan dihitung seolah-olah ada di setiap hari dalam sebulan (= hingga foto berikutnya).
Jadi jika saya ingin mempertimbangkan jumlah rata-rata posting per hari> = 6 bulan, di mana saya hanya memiliki 1 snapshot, saya akan menetapkan snapshot itu dengan berat 30.
Jadi, pos rata-rata yang diterbitkan dalam sebulan untuk rentang> = 6 bulan yang lalu adalah:
SELECT category, SUM(cnt) / 30
from (
SELECT category, COUNT(*)*30 as cnt
from day1.My_table
group by category --- Note: I'm not considering the range defined from the user in this example.
) group by category;
Seperti komentar juga menyatakan, saya perlu melakukan kueri seperti:
Select category, AVG(*)
from [fromRange-toRange].MyTable;
Untuk solusi ekstrem, saya sedang mempertimbangkan ide menerapkan bahasa logam agar pengguna masa depan (mis. Orang marketng) dapat melakukan kueri seperti ini.
Apakah Anda pikir ada cara untuk mencapai ini di Bor tanpa bahasa meta? Saya akan melakukan ini menggunakan UDF rekursif tetapi mereka tidak dapat mengembalikan pertanyaan.
Setiap snapshot berukuran besar 250GB, dan saya ingin dapat membandingkan dataset ini dengan data eksternal lainnya (saya tidak tahu sebelumnya skema dari dataset ini).
Apakah ada solusi yang cocok untuk Apache Drill? Atau adakah solusi lain untuk masalah ini?
Juga setiap bahasa atau makalah tentang masalah ini dihargai.
Sunting: Kami belum memiliki data transaksional. Kami memiliki data yang berubah dalam waktu, dan dapat ditambahkan atau dihapus; untuk alasan ini kita perlu foto sehari-hari. Kami juga tidak tahu sebelumnya pertanyaan yang akan dilakukan, jadi kami tidak bisa tahu jenis agregasi apa yang harus dilakukan. Juga setiap baris memiliki sekitar 100 kolom, dan ada yang mengatakan 250GB per snapshot (tabel Mysql). Kami juga membutuhkan pencarian teks lengkap pada data ini di setiap baris, pada setiap hari yang memungkinkan.
Contoh pencarian dapat berupa "Berapa banyak posting tentang sesuatu yang aneh?" Jadi itu harus mencari semua posting untuk kata kunci sometopic. Setiap snapshot mungkin atau tidak memiliki baris yang sama. Juga dua snapshot dapat memiliki posting yang sama, tetapi sedikit dimodifikasi.
sumber
table definitions/structures
Jawaban:
Mari kita berpikir di luar kotak. Alih-alih memiliki "snapshot", mari kita memiliki "log". Apa yang Anda miliki saat ini adalah keadaan "terkini"; menambahkan "log" akan memberikan "histori", yang darinya dapat diturunkan info yang 'hilang'.
Salah satu cara untuk mengimplementasikan log adalah memiliki
TRIGGER
onINSERT
atauUPDATE
of the table, dan membuat trigger menulis ke file log. Log ini tidak akan menyenangkan untuk permintaan ad hoc, jadi miliki pekerjaan malam (atau mungkin setiap jam) yang merangkum perubahan untuk hari itu - keuntungan (atau kerugian) jumlah posting, dll. Info "day2" dan info "bulan lalu" kemudian dapat diturunkan dari tabel ringkasan ini dengan cukup cepat. Atau mungkin tingkat kedua dari peringkasan yang menyatakan seperti apa keadaan setiap hari. Saya ragu apakahUNION
akan dibutuhkan. "Cuplikan" tidak akan terlibat.sumber
Jadi yang saya cari adalah tipe sistem baru yang terkait dengan Datawarehousing: Data Lake System.
Anda dapat mempelajari lebih lanjut di Wikipedia :
sumber