Group By di Hive pada tabel yang dipartisi memberikan baris hasil duplikat

Menggunakan rilis 0.11.0. Saya mendapatkan hasil yang salah ketika mencoba menjalankan kueri ini

select t1.symbol, max(t1.maxts - t1.orderts) as diff from 
    (select catid, symbol, max(cast(timestamp as double)*1000) as maxts, min(cast(timestamp as double)*1000) as orderts, count(*) as cnt 
        from cat where recordtype in (0,1) and customerid=srcrepid group by symbol, catid) t1
where t1.cnt > 1
group by t1.symbol;

Seperti yang Anda lihat, ada subkueri dengan pernyataan grup demi. Subquery ini menghitung nilai stempel waktu maksimum dan minimum per MYID dan SYMBOL.

Sekarang, saya memiliki 24 simbol. Di kueri luar, saya ingin mencari perbedaan maksimal per SIMBOL jadi saya mengelompokkannya berdasarkan SIMBOL.

Masalahnya adalah ini mengembalikan 864 baris hasil saat ini. Hive tampaknya gagal mengurangi hasil terakhir menjadi apa yang saya harapkan.

Apakah ini bug? Adakah yang bisa mereproduksi ini? Saya memiliki 6 node yang berjalan dengan 4 simbol per node.

Tabel yang digunakan:

create table cat(CATID bigint, CUSTOMERID int, FILLPRICE double, FILLSIZE int, INSTRUMENTTYPE int, ORDERACTION int, ORDERSTATUS int, ORDERTYPE int, ORDID string, PRICE double, RECORDTYPE int, SIZE int, SRCORDID string, SRCREPID int, TIMESTAMP timestamp) PARTITIONED BY (SYMBOL string, REPID int) row format delimited fields terminated by ',' stored as ORC;
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions.pernode=1000;
hive.exec.max.dynamic.partitions.pernode=1000;

Diedit: Diedit karena kueri tidak konsisten dengan tabel sebenarnya yang digunakan, sehingga sulit untuk memberikan bantuan apa pun...


person UmaN    schedule 15.09.2013    source sumber


Jawaban (3)


Seperti yang dijelaskan oleh Yin di sarang mail list ini adalah bug yang terkait dengan kesalahan.

Ketika Hive hanya menggunakan satu pekerjaan pengurangan peta, kedua kolom partisi digunakan sedangkan kueri saya hanya ingin mengelompokkan berdasarkan simbol.

Rupanya bug ini telah diperbaiki di bagasi.

Dan inilah laporan bug lainnya yang menunjukkan masalah ini dengan lebih jelas

person UmaN    schedule 17.09.2013

Saya pikir ini mungkin berhasil jika, di kueri luar, Anda menyusunnya seperti ini:

PILIH t1.simbol, max(t1.maxts) - min(t1.orderts) AS diff, ....

person spfister    schedule 15.09.2013
comment
Saya akan mencobanya ketika saya memiliki mesin yang tersedia. Terima kasih atas masukannya. - person UmaN; 16.09.2013

Saya telah melihat bahwa jika Anda memperkenalkan klausa ORDER BY setelah GROUP BY pertama memaksa sarang menjadi dua pekerjaan MR dan kemudian memberikan hasil yang benar.

Seperti yang diminta, tambahkan modifikasi kueri sebagai contoh.

pilih t1.symbol, max(t1.maxts - t1.orderts) sebagai perbedaan dari (pilih catid, simbol, max(cast(timestamp as double)*1000) sebagai maxts, min(cast(timestamp as double)1000 ) sebagai pesanan, hitung() sebagai cnt dari cat di mana recordtype di (0,1) dan customerid=srcrepid kelompokkan berdasarkan simbol, catid ORDER BY simbol, catid) t1 di mana t1.cnt > 1 grup berdasarkan t1.simbol;

Tapi ya, ini masih hanya mengatasi masalah ini, tetapi masalah sebenarnya adalah Hive menggunakan bidang partisi yang salah dalam kueri itu, seharusnya hanya menggunakan simbol tetapi jika Anda melihat penjelasannya bahwa ia menggunakan simbol dan catid yang menyebabkannya untuk memberikan hasil yang berlipat ganda.

Menambahkan ORDER BY memaksa Hive untuk melakukan kelompok kedua dengan pekerjaan MR yang berbeda sehingga memberi kita hasil yang tepat.

person Pavan Lanka    schedule 03.06.2014
comment
Sepertinya ini jawaban yang bagus, bisakah Anda mengedit dan menampilkan lebih banyak detail yang akan membantu menjawab Q secara langsung? - person xlm; 04.06.2014