❶ 如何查看hivesql里執行了哪些查詢
思路
當我們在終端下執行命令「hive」後,會看到有如下輸出:
Hive有會話(Session)的概念,而這次會話中的所有日誌消息將會輸出到這個日誌文件中,包含SQL語句的執行日誌,查看這個日誌文件可以看到以下信息:
❷ hive sql里,幫我描述一個簡單的sql的原理
select a.id,a.info,b.num from a join b on a.id=b.id and where b.num>=10
兩個表做關聯,首先where會過濾掉不需要的數據。
至於表怎麼做map和rece操作,在hive里的表是虛擬的,其實還是對hdfs文件進行操作,你可以在hdfs:///user/hive/warehouse路徑下找到以表名來命名的文件,裡面就是表的內容,可以執行-cat命令查看。所以,它的map操作很簡單,就是按行讀文件,然後會根據hive的默認分隔符\001對每行進行切分。切分完成後就會按照你SQL指定的邏輯進行合並,最後再輸出成hdfs文件,只不過在hive裡面看它是以表的形式展現的。
job數會在你執行sql語句之後緊接著有相應的日誌記錄,
Total MapRece jobs = 2
Launching Job 1 out of 2
Number of rece tasks not specified. Estimated from input data size: 2
In order to change the average load for a recer (in bytes):
set hive.exec.recers.bytes.per.recer=<number>
In order to limit the maximum number of recers:
set hive.exec.recers.max=<number>
In order to set a constant number of recers:
這樣就是有兩個job,正在執行第一個job。
Hadoop job information for Stage-1: number of mappers: 5; number of recers: 2
而這個就會告訴你有多少個mapper和recer。
像你寫的這個sql有join操作,而且是hiveSQL裡面最普通的join,那麼一定會有recer參與,如果數據量很大,比如上千萬條記錄,join就會特別慢,job進度就會一直卡在rece操作。可以改成mapjoin或者sort merge bucket mapjoin。
其實hive效率不高,不適合實時查詢,即使一個表為空,用hive進行查詢也會很耗時,因為它要把sql語句翻譯成MR任務。雖然簡化了分布式編程,但是效率上就會付出代價。
你的這句sql應該會翻譯成一個JOB來執行,就是簡單地map和rece。
maprece就是按行讀文件,然後切分,合並,輸出成文件。
❸ sql語句 同時查詢兩個表
sql多表關聯查詢跟條件查詢大同小異,主要是要知道表與表之前的關系很重要;舉例說明:(某資料庫中有3張表分別為:userinfo,dep,sex)
userinfo(用戶信息表)表中有三個欄位分別為:user_di(用戶編號),user_name(用戶姓名),user_dep(用戶部門) 。(關系說明:userinfo表中的user_dep欄位和dep表中的dep_id欄位為主外鍵關系,userinfo表中的user_sex欄位和sex表中的sex_id欄位為主外鍵關系)
❹ 求問 hadoop +hive ,怎麼通過hive的sql實現分頁查詢(分批查詢)。
簡單的辦法是按小時分區,之後一次取一小時
❺ hive sql 將兩張表連接成為第三張表
SELECT a.* FROM a JOIN b ON (a.id = b.id);
建議看看官方wiki:
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins
❻ hive如何同時執行多段sql
hive sql放到文件當中,之後 hive -f filename執行
❼ hive 多表插入出問題,from 後接子查詢
應該是:
from (select * from ...) a join (select * from ....) b on (a.key=b.key)
❽ 使用hive sql 連接表查詢時,會產生中間表,這些中間表這怎麼存儲的
沒明白你說的,但是我想應該是這樣!
有三張表。 學生、課程、老師
s(sid、sname、sex、age) 代表 學生(學生號、姓名、性別、年齡)
c(cid、sid 、cname、grade) 課程(課程號、學生號、課程名、成績)
t(tid、tname、cid) 老師 (教師號、教師姓名、課程號)
select * from student,course,teacher
where s.sid = c.sid and c.cid = t.cid ;
三表連接就完成了。
當然還有其他方式建立三表連接。我這種方式最簡單直觀了。
希望對你有幫助!
❾ hive sql 優化的常用手段有哪些
1、join連接時的優化:當三個或多個以上的表進行join操作時,如果每個on使用相同的欄位連接時只會產生一個maprece。
2、join連接時的優化:當多個表進行查詢時,從左到右表的大小順序應該是從小到大。原因:hive在對每行記錄操作時會把其他表先緩存起來,直到掃描最後的表進行計算
3、在where字句中增加分區過濾器。
4、當可以使用left semi join 語法時不要使用inner join,前者效率更高。原因:對於左表中指定的一條記錄,一旦在右表中找到立即停止掃描。