Gudang Data: Bagaimana cara saya meminta snapshot harian?

9

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.

Federico Ponzi
sumber
Sepertinya Anda memiliki struktur yang layak untuk data Anda .. apakah ada alasan khusus mengapa Anda mencari solusi bebas skema? Dengan skema saya berasumsitable definitions/structures
vmachan
Karena saya tidak ingin mendefinisikan tabel baru sebelum memuat dataset saya. Tentu jika ada solusi yang dapat menangani masalah ini tetapi perlu tabel untuk didefinisikan sebelumnya saya akan memilihnya.
Federico Ponzi
Snapshots harian 250GB? Dengan persyaratan itu? Bagaimana?
Tom V - coba topanswers.xyz
Mengapa snapshot harian? Berapa banyak perubahan 250 GB sehari? Apa yang salah dengan pendekatan Dimensi yang Berubah Secara perlahan?
dnoeth
Tolong jangan berpikir masalah ini dalam hal pergudangan data, tetapi dalam hal bagaimana untuk query dan / atau data besar. Saya memiliki snapshot harian yang berbeda dari basis data saya, dan saya ingin cara untuk menanyakannya secara efektif.
Federico Ponzi

Jawaban:

2

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 TRIGGERon INSERTatau UPDATEof 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 apakah UNIONakan dibutuhkan. "Cuplikan" tidak akan terlibat.

Rick James
sumber
1
Saya bertanya tentang cara meminta snapshot harian, Anda hanya berbicara tentang pengoptimalan - saya akan memikirkannya nanti. Terima kasih
Federico Ponzi
1
Snapshots sulit untuk ditangani (menurut saya), jadi saya mencoba menghadirkan cara untuk memecahkan masalah 'nyata' alih-alih mendapatkan solusi yang sulit. Juga, peringkasan akan memungkinkan permintaan yang jauh lebih cepat.
Rick James
2

Jadi yang saya cari adalah tipe sistem baru yang terkait dengan Datawarehousing: Data Lake System.

Anda dapat mempelajari lebih lanjut di Wikipedia :

Danau data adalah metode penyimpanan data dalam suatu sistem yang memfasilitasi colokasi data dalam skema varian dan bentuk struktural, biasanya objek gumpalan atau file. Platform Hadoop dan AWS S3 dapat digunakan untuk membangun repositori data lake.

Federico Ponzi
sumber