A. hive sql怎麼給欄位內的值加上前綴
從文件載入數據進表(OVERWRITE覆蓋,追加不需要OVERWRITE關鍵字)
LOAD DATA LOCAL INPATH 'dim_csl_rule_config.txt' OVERWRITE into table dim.dim_csl_rule_config;
--從查詢語句給table插入數據
INSERT OVERWRITE TABLE test_h02_click_log PARTITION(dt) select *
from stage.s_h02_click_log where dt='2014-01-22' limit 100;
B. hive on spark overwrite 空表不覆蓋
dataframe.registerTempTable("result")
sql(s"""INSERT OVERWRITE Table $outputTable PARTITION (dt ='$outputDate') select * from result""")
而整個結果數據的產生只需要4分鍾左右的時間,比如以下方式:將結果以textfile存入hdfs:
result.rdd.saveAsTextFile(output_tmp_dir)
由此可見,對hive的寫入操作耗用了大量的時間。
對此現象的優化可以是,將文件存為符合hive table文件的格式,然後使用hive load將產生的結果文件直接move到指定目錄下。代碼如下:
result.rdd.map { r => r.mkString("\001") }.repartition(partitions).saveAsTextFile(output_tmp_dir)
sql(s"""load data inpath '$output_tmp_dir' overwrite into table $output partition (dt='$dt')""")
C. hql語句怎麼寫向Hive中一次插入一條數據或一個欄位的值,類似關系型資料庫的sql語句
目前我知道的方法是把你希望添加的數據寫入到文本中,然後從文本導入到你的表格中。
但是,hive不知道oracle的insert into , update。
load data [local] inpath 'yourfile_location' [overwrite] into your_table;
D. hive如何同時執行多段sql
hive sql放到文件當中,之後 hive -f filename執行
E. 如何用sql對maxcompute數據進行修改和刪除
//1.你創建一個insert觸發器,每當數據插入的時候判斷一下是不是有你要刪除的數據。 //2.你還可以創建一個存儲過程,然後再做一個作業任務,讓 sql server 每多長時間刪除一次。
F. 如何用數字 取hive表某列值
Hive的insert語句能夠從查詢語句中獲取數據,並同時將數據Load到目標表中。現在假定有一個已有數據的表staged_employees(雇員信息全量表),所屬國家cnty和所屬州st是該表的兩個屬性,我們做個試驗將該表中的數據查詢出來插入到另一個表employees中。
INSERT OVERWRITE TABLE employees
PARTITION (country = '中國', state = '北京')
SELECT * FROM staged_employees se
WHERE se.cnty = '中國' AND se.st = '北京';
由於使用了OVERWRITE關鍵字,目標表中原來相同partition中的所有數據被覆蓋,如果目標表中沒有partition,則整個表會被覆蓋。
如果把OVERWRITE關鍵字刪掉,或者替換成INTO,則hive會追加而不是替代原分區或原表中的數據,這個特性在Hive v0.8.0之後才支持。
當數據已經存在於hdfs上但不是我們想要的格式的時候,當進行的計算需要分好多步驟有必要存儲中間數據的時候,或者原數據沒有分區、有很多無效列需要過濾的時候,可以使用insert..select句型來完成這一轉換過程。
由於一個國家有很多個省份,如果想根據(國家country,地區partition)兩個維度對數據進行分區的話,這條SQL語句的執行個數應該等於地區的數目,比如中國有23個省就要對該SQL語句執行23次。因此hive對這個SQL語句進行了改造,只需要掃描一次原表就可以生成不同的輸出(多路輸出)。比如下面的SQL語句掃描了一次原始數據表,但是同時生成了3個省份的結果數據:
FROM staged_employees se
INSERT OVERWRITE TABLE employees
PARTITION (country = '中國', state = '河北省')
SELECT * WHERE se.cnty = '中國' AND se.st = '河北省'
INSERT OVERWRITE TABLE employees
PARTITION (country = '中國', state = '陝西省')
SELECT * WHERE se.cnty = '中國' AND se.st = '陝西省'
INSERT OVERWRITE TABLE employees
PARTITION (country = '中國', state = '河南省')
SELECT * WHERE se.cnty = 'US' AND se.st = '河南省';通過縮進可以很清楚的看到,我們掃描了一次staged_employees表但是執行了3次不同的insert語句,這條大SQL語句是這么執行的:先通過from staged_employees表獲取一條記錄,然後執行每一個select子句,如果select子句驗證通過則執行相應的insert語句。注意這里的三條select子句是完全獨立執行的,並不是if .. then .. else的關系,這就意味著這3條select子句在某種情況下可能同時通過where檢測。
通過這種結構,原始表的數據能被拆分到目標表的不同partition中去。
如果原表的一條記錄滿足於其中一個給定的select .. where .. 子句,則該記錄將被寫到目標表的固定分區中。其實更進一步,每條Insert語句能將數據寫到不同的數據表中,不管這個表是否分區都一樣。
於是,就像一個過濾器一樣,原表的一些數據被寫到了很多輸出地址,而剩下的數據會被丟棄。
當然,你也可以混用Insert overwrite和insert into兩種不同的方法寫出數據。
向動態分區插入數據
但是問題還是沒有解決,中國有23個省,那麼我們就需要寫23個insert into .. select ..where子句,這非常不現實。於是hive的一種叫做動態分區的特性就出現了,它能夠根據select出來的參數自動推斷將數據插入到那個分區中去。本文上面的兩種SQL語句設定分區的方式都叫做靜態分區插入。
將上一個SQL語句進行改動,會得到以下簡潔的新SQL語句:
INSERT OVERWRITE TABLE employees
PARTITION (country, state)
SELECT ..., se.cnty, se.st
FROM staged_employees se;hive先獲取select的最後兩個位置的se.cnty和se.st參數值,然後將這兩個值填寫到Insert語句partition中的兩個country和state變數中,即動態分區是通過位置來對應分區值的。原始表select出來的值和輸出partition的值的關系僅僅是通過位置來確定的,和名字並沒有關系,比如這里se.cnty和county的名稱完全沒有關系。
上面的這條SQL語句是對兩個分區同時進行了動態設定,如果staged_employees表中有100個國家,每個國家有100個地區,那麼該SQL語句自動對每個國家和地區建立相應的partition並插入數據,如果用手寫的話不現實。
只要位置正確,你可以混用動態分區和靜態分區值設定,比如下面這個例子,你可以靜態指定一個country值,但是state值採用動態的方法設定:
INSERT OVERWRITE TABLE employees
PARTITION (country = 'US', state)
SELECT ..., se.cnty, se.st
FROM staged_employees se
WHERE se.cnty = 'US';注意:靜態分區值必須在動態分區值的前面!
G. 為什麼跑hive hadoop出現很多臨時文件
今天將臨時表裡面的數據按照天分區插入到線上的表中去,出現了Hive創建的文件數大於100000個的情況,我的SQL如下:
hive> insert overwrite table test partition(dt)
> select * from iteblog_tmp;
iteblog_tmp表裡面一共有570多G的數據,一共可以分成76個分區,SQL運行的時候創建了2163個Mapper,0個Recers。程序運行到一般左右的時候出現了以下的異常:
[Fatal Error] total number of created files now is 100385, which exceeds 100000. Killing the job.
並最終導致了SQL的運行失敗。這個錯誤的原因是因為Hive對創建文件的總數有限制(hive.exec.max.created.files),默認是100000個,而這個SQL在運行的時候每個Map都會創建76個文件,對應了每個分區,所以這個SQL總共會創建2163 * 76 = 164388個文件,運行中肯定會出現上述的異常。為了能夠成功地運行上述的SQL,最簡單的方法就是加大hive.exec.max.created.files參數的設置。但是這有個問題,這會導致在iteblog中產生大量的小文件,因為iteblog_tmp表的數據就570多G,那麼平均每個文件的大小=570多G / 164388 = 3.550624133148405MB,可想而知,十萬多個這么小的小文件對Hadoop來說是多麼不好。那麼有沒有好的辦法呢?有!
我們可以將dt相同的數據放到同一個Rece處理,這樣最多也就產生76個文件,將dt相同的數據放到同一個Rece可以使用DISTRIBUTE BY dt實現,所以修改之後的SQL如下:
hive> insert overwrite table test partition(dt)
> select * from iteblog_tmp
> DISTRIBUTE BY dt;
修改完之後的SQL運行良好,並沒有出現上面的異常信息,但是這里也有個問題,因為這76個分區的數據分布很不均勻,有些Rece的數據有30多G,而有些Rece只有幾K,直接導致了這個SQL運行的速度很慢!
能不能將570G的數據均勻的分配給Rece呢?可以!我們可以使用DISTRIBUTE BY rand()將數據隨機分配給Rece,這樣可以使得每個Rece處理的數據大體一致。我設定每個Rece處理5G的數據,對於570G的數據總共會起110左右的Reces,修改的SQL如下:
hive> insert overwrite table test partition(dt)
> select * from iteblog_tmp
> DISTRIBUTE BY rand();
這個SQL運行的時間很不錯,而且生產的文件數量為Rece的個數*分區的個數,不到1W個文件。
H. hive查詢結果導入hadoop文件系統如何修改分隔符insert overwrite directory...
修改表的serde中的屬性,把outputformat那個類換成自己寫的,默認是\x001,可以修改成自用的,然後出來的文件就都按這個輸出分隔符分割了。
I. insert overwrite 刪除哪些數據
insert overwrite table t_table1 select * from t_table1 where XXXX;
其中xxx是你需要保留的數據的查詢條件。
如果清空表,如下:
insert overwrite table t_table1 select * from t_table1 where 1=0;
J. 如何在sql server中存儲圖片
1、首先可以存儲圖片鏈接,設置圖片鏈接欄位,如下圖所示。