2015-06-06 22 views
5

Tôi mới dùng Google Big Query (và Stack Overflow), chủ yếu là kiểm tra tốc độ mà Big Query quản lý để xử lý cả các truy vấn được tạo thủ công và kém kỹ lưỡng.NHÓM THEO vấn đề trong Google Big Query

Tôi gặp khó khăn với truy vấn cồng kềnh chạy (chậm) trên MySQL. Big Query phàn nàn về nội dung GROUP BY. Đây là truy vấn bắt đầu:

SELECT nonstops.term, nonstops.lincat, nonstops.id, 
MIN(
(1-((LEAST(1,minusone.catimp/nonstops.catimp) + LEAST(1,minusone.catweb/nonstops.catweb))/2))* 
(1-((LEAST(1,minusone.catimp/nonstops.catimp) + LEAST(1,minusone.catweb/nonstops.catweb))/2))* 
(1-((LEAST(1,minusone.catimp/nonstops.catimp) + LEAST(1,minusone.catweb/nonstops.catweb))/2))* 
(nonstops.catweb * nonstops.catweb * nonstops.catimp/nonstops.fnvweb/nonstops.fnvimp) 
) 
AS calc FROM nonstops INNER JOIN EACH minusone ON nonstops.lincat = minusone.lincat AND nonstops.term = minusone.term 
WHERE nonstops.lincat = 556 GROUP BY nonstops.term, nonstops.lincat 
ORDER BY `calc` DESC 

Lưu ý rằng "MACHI" được thêm vào INNER JOIN vì cả hai bảng đều lớn. Tôi đã xóa tên tập dữ liệu để dễ đọc hơn.

GROUP BY được dự định chỉ trả lại giá trị thấp nhất của phép tính được thực hiện bởi sự tham gia cho mỗi cặp/cặp lincat.

Các lỗi tôi nhận được là:

(L1: 62): Biểu hiện 'phrases.nonstops.id' là không có mặt trong danh sách GROUP BY

Mà tôi không muốn trong GROUP BY, nhưng tôi đã thêm nó và sau đó tôi nhận được:

Biểu hiện 'calc' là không có mặt trong danh sách GROUP BY

mà tôi cũng không muốn! Nhưng nếu tôi thêm nó tôi nhận được:

(L7: 1): Không thể nhóm bởi một tổng hợp

Tôi đã xem xét các tài liệu và tìm kiếm một câu trả lời, nhưng không có may mắn. Bất kỳ gợi ý hoặc liên kết nào sẽ được đánh giá cao nhất.

Trả lời

3

Khi bạn nhóm theo thứ gì đó trong BigQuery (hoặc bất kỳ SQL nào), các trường kết quả phải là các trường hoặc nhóm tổng hợp theo nhóm.

Nếu không, bạn sẽ nhận được giá trị nào của nonstops.id? Có thể có nhiều liên kết với một cặp (nonstops.term, nonstops.lincat).

Bạn có thể chọn trường tối đa, tối thiểu, v.v. nhóm theo lĩnh vực này (nhưng sau đó bạn sẽ có được tính toán cho mỗi tuple thuật ngữ, lingcat và id); hoặc chỉ cần loại bỏ trường này nếu bạn không cần nó - nếu bạn muốn kết quả của biểu thức 'calc' cho mỗi cặp (nonstops.term, nonstops.lincat).

Lý do BigQuery than phiền về `calc` là khác nhau - BigQuery (khi bạn sử dụng phương ngữ SQL cũ) không sử dụng backticks (`) cho báo giá. Vì vậy, nó nghĩ rằng họ là một phần của tên và nó là một lĩnh vực mới tách biệt với lĩnh vực 'calc'. Chỉ cần xóa chúng hoặc sử dụng các trích dẫn của BigQuery [và] - [calc]. Hoặc chuyển sang phương ngữ SQL chuẩn.

+0

Cảm ơn Michael, backticks thực sự là một vấn đề. Trường id bị thiếu từ GROUP BY là một điểm tốt, vì dữ liệu này nó hoạt động tốt trong MySQL vì kết quả được tạo ra cùng một id cho mỗi nhóm (một chút dư thừa nhưng chỉ mục trên id được sử dụng). Tôi đã thay đổi nó theo gợi ý và nó hoạt động. – LocalGeek

+0

Nên thêm, hiệu suất khôn ngoan, mất 75 giây (dữ liệu 2,5 GB). Tách truy vấn thành JOIN (tạo một tập hợp dữ liệu) sau đó chạy GROUP BY mất 20 giây và sau đó 15 giây. Một hộp Linux với RAM 32GB 2133Mhz, 8GB được MySQL sử dụng một bộ xử lý AMD A10 khá chậm (7850K) với dữ liệu trên ổ SSD Samsung 840 mất khoảng 2000 giây để truy vấn đầy đủ hoặc tách chúng. – LocalGeek

+0

Hiệu suất-vise Tôi nghĩ rằng bạn có thể hưởng lợi bằng cách lọc trước khi JOIN (BigQuery không đủ thông minh để tự mình làm): CHỌN ... TỪ (CHỌN .. TỪ nonstops WHERE lincat = 556) INNER JOIN EACH (SELECT .. FROM minusone ĐÂU lincat = 556) ON nonstops.lincat = minusone.lincat VÀ nonstops.term = minusone.term GROUP BY nonstops.term, nonstops.lincat ORDER BY calc DESC – Michael

Các vấn đề liên quan