在使用hive寫hql時報10004錯誤,提示列字段名稱錯誤。這是一個很常見的錯誤。下面分析下這個錯誤的原因。
例如:select name,count(1) from student group by name order by id;
上面的語句在運行時就會報錯,爲什麼呢?因爲order by 在hive中是全局排序,也即是前面的執行完之後再起一個job對結果集進行全局排序。但上個job執行完以後列名變成了 name和 count(1)根本就沒有id這個列名,所以會報10004錯誤,提示你列名不匹配。
例如:select id from (select id as i from student ) order by id;
上面的語句也會報錯,因爲先執行子查詢後id字段已經改爲i列名,外面的查詢已經拿不到id字段,所有報列名不匹配錯誤。
其實會犯這種錯誤,就是因爲不瞭解hive在執行hql時底層的job執行邏輯,仍然按照傳統的sql邏輯去思考問題,就會被問題困住。
這裏記錄下hive的order by ,sort by 的區別
order by 是對查詢後的結果進行全局排序,sort by 是對每個reduce的結果進行排序的。如果數據很大不建議order by因爲會引起內存不足。