hive中grouping sets 數量較多時如何處理?
可以使用如下設置來
set hive.new.job.grouping.set.cardinality = 30;
這條設置的意義在於告知解釋器,group by之前,每條數據復制量在30份以內。
grouping sets是一種將多個group by 邏輯寫在一個sql語句中的便利寫法。
demo:
select A, B, C, group_id, count(A) from tableName group by --declare columns A, B, C grouping sets ( (A,C), (A,B), (B,C), (C) )
其中grouping sets中的(A,C), (A,B), (B,C), (C) 代表4個group by 組合, 相當於寫了四個sql查詢語句使用了四個不同的group by策略。
group_id是為了區分每條輸出結果是屬於哪一個group by的數據。它是根據group by后面聲明的順序字段是否存在於當前group by中的一個二進制位組合數據。 比如(A,C)的group_id: group_id(A,C) = grouping(A)+grouping(B)+grouping (C) 的結果就是:二進制:101 也就是5.
select中的字段是完整的A,B,C,但是我們知道由於group by的存在,select 字段本不應該出現非group by字段的,所以這里我們要特別說明,如果解釋器發現group by A,C 但是select A,B,C 那么運行時會將所有from 表取出的結果復制一份,B都置為null,也就是在結果中,B都為null。