Struktur data saya adalah sebagai berikut:
date: <timestamp>
filter_a: <integer> -> range [0, 1000]
filter_b: <integer> -> range [0, 1000]
filter_c: <integer> -> range [0, 86400]
filter_d: <integer> -> range [0, 6]
group: <string>
second_group: <integer>
variable_a: <float>
variable_b: <float>
variable_c: <float>
a couple more no very important
Saya perlu melakukan pertanyaan berikut:
Pertama:
- Filter data dengan
date
,filter_a
,filter_b
,filter_c
dan lain-lain
Kedua, dengan data yang difilter:
- hitung semua catatan
- dapatkan rata - rata
variable_a
,variable_b
danvariable_c
- mendapatkan standar deviasi dari
variable_a
,variable_b
danvariable_c
- dapatkan kuartil dari
variable_a
,variable_b
danvariable_c
- kelompokkan data dengan
group
atausecond_group
dan agregat (Hitung, Rta, Std, ..)
Jumlah pengguna sistem adalah sekitar 10 atau 15, tetapi jumlah item sangat besar, saat ini adalah 70 juta tetapi akan menjadi 500 juta dalam beberapa minggu dan akan menjadi 1.000 juta dalam waktu sekitar satu tahun.
Jumlah pertanyaan kecil, tidak lebih dari 10 pengguna secara bersamaan, masalah saya adalah bagaimana menangani pertanyaan-pertanyaan dengan jumlah data yang sangat besar ini.
Apa yang sudah saya coba sejauh ini?
Saya mulai dengan
mongodb
, pada awalnya itu cepat tetapi menjadi lambat ketika menghitung kuartil dengan 10M +. Itu membaik ketika saya menambahkan indeks tetapi tidak banyak membantu ketika saya harus menanyakan semua data. Saya mulai menggunakan mongodb karena data sangat dinamis tetapi untungnya format data "tidak akan berubah lagi".Seperti
filter_a
danfilter_b
dapat dilihat seperti node, saya mencobaneo4j
. Saya sangat menyukainya, tetapi grafik saya memiliki BANYAK tepi sehingga permintaan tidak terlalu cepat.Akhirnya, karena format data tidak akan berubah dan itu hanya satu koleksi / tabel jadi tidak perlu bergabung dalam SQL, saya memeriksa postgresql. Tes saya lebih cepat dengan postgresql, tetapi saya khawatir tes ini tidak dapat mengukur dengan benar di masa mendatang.
Apa yang saya butuhkan?
- Apakah postgresql pilihan yang baik untuk kasus ini?
- Apakah ada jenis database lain yang bisa saya gunakan? mana yang terbaik untuk kasus ini?
- Apa lagi yang bisa saya lakukan untuk memperbaikinya?
Edit
- Sekitar 1M elemen dimasukkan setiap hari dan "tidak boleh berubah" sepanjang waktu.
- Kecepatan menulis tidak penting
- Syarat sulitnya adalah membaca / agregat cepat
Terima kasih!
Jawaban:
Alih-alih bersandar pada database relasional untuk melakukan perhitungan statistik ini pada data time-series, saya sarankan Anda memindahkan matematika ini dan pekerjaan post-processing di luar database ke dalam aplikasi klien.
Menggunakan bahasa skrip seperti Python atau Ruby, Anda dapat secara bertahap menyelesaikan masalah dengan meminta "potongan" data selama periode waktu tetap lebar, menghitung ringkasan statistik menengah, dan kemudian menggabungkan hasil di beberapa potongan, saat Anda mengulangi seluruh sejarah. Beberapa ukuran statistik sulit untuk digabungkan antar bongkahan, tetapi sesuatu seperti Rata-rata () hanya perlu jumlah () dan hitung () per bongkahan, O (1) vs O (bungkusan), sehingga penggabungan bongkahan dapat berskala baik.
sumber
chunksize
bisa membantu. +1Karena data Anda tidak berubah, dan hanya ditambahkan, saya akan menyimpan data di mana pun Anda suka; Amazon S3 misalnya, tetapi basis data yang membaca cepat tidak masalah. Tidak ada indeks. Basis data / FS yang Anda pilih harus memiliki opsi untuk membaca data dalam ember: Anda dapat, misalnya, satu file per hari dengan catatan 1M Anda.
Kemudian saya akan menggunakan Spark untuk melakukan penyaringan / analisis. Berbasis cluster, Anda dapat menyesuaikannya dengan kebutuhan Anda.
sumber
Respons tergantung dari cara Anda akan menggunakan data setelah ini. Jika untuk pemrosesan lebih baik gunakan Cassandra, jika untuk analisis lebih baik gunakan Hive.
sumber
real time
. Apakah aku salah?Situasi semacam ini sangat ideal untuk pergudangan data, menggunakan teknik yang disempurnakan oleh Ralph Kimball dan rekan, pada platform seperti SQL Server (yang saya paling akrab dengan). Mereka dirancang khusus dengan jenis skenario ini dalam pikiran: sejumlah besar catatan data yang relatif statis, untuk itu Anda perlu menghitung agregat jenis ini. Tidakteknik relasional akan cocok untuk data pergudangan yang diimplementasikan dengan benar dalam aplikasi semacam ini, meskipun beberapa tentu akan lebih baik daripada yang lain jika organisasi Anda tidak mampu membeli lisensi untuk paket perangkat lunak (seperti SQL Server Analysis Services) yang mengimplementasikannya. Ada juga kurva belajar untuk mengimplementasikan bahasa seperti MDX yang dibuat khusus untuk akses data semacam ini. Jika pergudangan data merupakan opsi yang layak untuk organisasi Anda, maka jangan buang waktu mencari solusi relasional; ini bukan masalah basis data relasional. Saya dapat memposting beberapa referensi dasar ke Kimball dll. Dan tautan ke SSAS dan MDX (maaf saya tidak bisa membantu dengan Oracle dan kompetitor lain yang saya tidak kenal) dokumentasi jika perlu. Saya harap itu membantu.
sumber