จัดกลุ่มตามในไฮฟ์บนตารางที่แบ่งพาร์ติชันให้แถวผลลัพธ์ที่ซ้ำกัน

ใช้รีลีส 0.11.0 ฉันได้รับผลลัพธ์ที่ไม่ถูกต้องเมื่อพยายามดำเนินการค้นหานี้

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;

อย่างที่คุณเห็น มีแบบสอบถามย่อยที่มีคำสั่งแบบกลุ่มตามคำสั่ง แบบสอบถามย่อยนี้จะคำนวณค่าสูงสุดและต่ำสุดของค่าการประทับเวลาต่อ MYID และ SYMBOL

ตอนนี้ฉันมี 24 สัญลักษณ์ ในแบบสอบถามภายนอก ฉันต้องการค้นหาความแตกต่างสูงสุดต่อ SYMBOL ดังนั้นฉันจึงจัดกลุ่มตาม SYMBOL

ปัญหาคือตอนนี้ส่งคืนแถวผลลัพธ์ 864 แถว ดูเหมือนว่า Hive จะล้มเหลวในการลดผลลัพธ์สุดท้ายให้เป็นสิ่งที่ฉันคาดหวังที่จะเห็น

นี่เป็นข้อผิดพลาดหรือไม่? มีใครสามารถทำซ้ำสิ่งนี้ได้หรือไม่? ฉันมี 6 โหนดที่ทำงานโดยมี 4 สัญลักษณ์ต่อโหนด

ตารางที่ใช้:

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;

แก้ไข: แก้ไขเนื่องจากแบบสอบถามไม่สอดคล้องกับตารางจริงที่ใช้ ทำให้ยากต่อการให้ความช่วยเหลือ...


person UmaN    schedule 15.09.2013    source แหล่งที่มา


คำตอบ (3)


ตามที่อธิบายโดย Yin บนไฮฟ์ รายชื่ออีเมล นี่เป็นจุดบกพร่องที่เกี่ยวข้องกับ ข้อผิดพลาด

เมื่อ Hive ใช้งาน mapreduce เพียงงานเดียว การแบ่งคอลัมน์ทั้งสองคอลัมน์จะถูกใช้ ในขณะที่แบบสอบถามของฉันต้องการจัดกลุ่มตามสัญลักษณ์เท่านั้น

เห็นได้ชัดว่าข้อผิดพลาดนี้ได้รับการแก้ไขใน trunk แล้ว

และนี่คือรายงานข้อผิดพลาดอีกฉบับที่แสดงให้เห็นถึงปัญหาได้ชัดเจนยิ่งขึ้น

person UmaN    schedule 17.09.2013

ฉันคิดว่ามันอาจจะได้ผลถ้าคุณจัดโครงสร้างสิ่งนี้ในแบบสอบถามภายนอก:

เลือก t1.สัญลักษณ์, สูงสุด(t1.maxts) - นาที(t1.orderts) AS diff, ....

person spfister    schedule 15.09.2013
comment
ฉันจะลองสิ่งนี้เมื่อฉันมีเครื่องว่าง ขอบคุณสำหรับการป้อนข้อมูล - person UmaN; 16.09.2013

ฉันได้เห็นแล้วว่าหากคุณแนะนำส่วนคำสั่ง ORDER BY หลังจากกลุ่ม GROUP BY แรกรวมกลุ่มกันเป็นสองงาน MR และให้ผลลัพธ์ที่ถูกต้องที่นั่น

ตามที่ร้องขอให้เพิ่มการแก้ไขแบบสอบถามเป็นตัวอย่าง

เลือก t1.สัญลักษณ์, สูงสุด (t1.maxts - t1.orderts) แตกต่างจาก (เลือก catid, สัญลักษณ์, สูงสุด (ส่ง (ประทับเวลาเป็นสองเท่า)*1,000) เป็นสูงสุด, ขั้นต่ำ (ส่ง (ประทับเวลาเป็นสองเท่า)1,000 ) เป็นลำดับ นับ() เป็น cnt จาก cat โดยที่ประเภทระเบียนใน (0,1) และ customerid=srcrepid กลุ่มตามสัญลักษณ์ catid ORDER BY สัญลักษณ์ catid) t1 โดยที่ t1.cnt > 1 กลุ่มโดย t1.สัญลักษณ์;

แต่ใช่ นี่ยังเป็นเพียงวิธีแก้ปัญหาเท่านั้น แต่ปัญหาที่แท้จริงคือ Hive ใช้ฟิลด์การแบ่งพาร์ติชั่นที่ไม่ถูกต้องในการสืบค้นนั้น มันควรจะใช้เพียงสัญลักษณ์ แต่ถ้าคุณเห็นคำอธิบายว่ามันใช้ทั้งสัญลักษณ์และ catid ซึ่งเป็นสาเหตุ เพื่อให้ได้ผลลัพธ์ที่หลากหลาย

การเพิ่ม ORDER BY บังคับให้ Hive ทำกลุ่มที่สองในงาน MR อื่นที่ให้ผลลัพธ์ที่ถูกต้องแก่เรา

person Pavan Lanka    schedule 03.06.2014
comment
ฟังดูน่าจะเป็นคำตอบที่ดี คุณช่วยแก้ไขและแสดงรายละเอียดเพิ่มเติมที่จะช่วยตอบคำถามโดยตรงได้ไหม - person xlm; 04.06.2014