hive從查詢中獲取資料插入到表或動態分割槽
轉自:http://www.crazyant.net/1197.html
Hive的insert語句能夠從查詢語句中獲取資料,並同時將資料Load到目標表中。現在假定有一個已有資料的表staged_employees(僱員資訊全量表),所屬國家cnty和所屬州st是該表的兩個屬性,我們做個試驗將該表中的資料查詢出來插入到另一個表employees中。
1234 | INSERT OVERWRITE TABLE employeesPARTITION(country='中國',state='北京')SELECT *FROM staged_employees seWHERE se.cnty='中國'AND |
如果把OVERWRITE關鍵字刪掉,或者替換成INTO,則hive會追加而不是替代原分割槽或原表中的資料,這個特性在Hive v0.8.0之後才支援。
當資料已經存在於hdfs上但不是我們想要的格式的時候,當進行的計算需要分好多步驟有必要儲存中間資料的時候,或者原資料沒有分割槽、有很多無效列需要過濾的時候,可以使用insert..select句型來完成這一轉換過程。
由於一個國家有很多個省份,如果想根據(國家country,地區partition)兩個維度對資料進行分割槽的話,這條SQL語句的執行個數應該等於地區的數目,比如中國有23個省就要對該SQL語句執行23次。因此hive對這個SQL語句進行了改造,只需要掃描一次原表就可以生成不同的輸出(多路輸出)。比如下面的SQL語句掃描了一次原始資料表,但是同時生成了3個省份的結果資料:
1 2 3 4 5 6 7 8 9 10 |
FROM
staged_employees
se
INSERT
OVERWRITE
TABLE
employees
PARTITION(country='中國',state='河北省')
SELECT
*WHERE
se.cnty='中國'ANDse.st='河北省'
INSERT
OVERWRITE
TABLE
employees
PARTITION(country='中國',state='陝西省')
SELECT
*WHERE
se.cnty='中國'ANDse.st='陝西省'
INSERT
|
通過縮排可以很清楚的看到,我們掃描了一次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語句:
1234 | INSERT OVERWRITE TABLE employeesPARTITION(country,state)SELECT...,se.cnty,se.stFROM 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值採用動態的方法設定:
1 2 3 4 5 | INSERT OVERWRITE TABLE employees PARTITION(country='US',state) SELECT...,se.cnty,se.st FROM staged_employees se WHERE se.cnty='US'; |
注意:靜態分割槽值必須在動態分割槽值的前面!
使用hive動態分割槽的引數設定
動態分割槽功能預設是關閉的,而當它是開啟狀態時,預設會工作在“strict”模式下,這種模式下要求至少指定一個靜態分割槽的值。這樣做是為了防止設計了大量partition的糟糕情況,舉個例子你使用時間戳來進行分割槽,竟然每一秒鐘都產生一個分割槽!還有其他的一些屬性設定用來限制類似的情況出現,如下表所示:
名稱 | 預設值 | 描述 |
hive.exec.dynamic.partition | FALSE | 設定為true用於開啟動態分割槽功能 |
hive.exec.dynamic.partition.mode | strict | 設定為nonstrict能夠讓所有的分割槽都動態被設定,否則的話至少需要指定一個分割槽值 |
hive.exec.max.dynamic.partitions.pernode | 100 | 能被每個mapper或者reducer建立的最大動態分割槽的數目,如果一個mappre或者reducer試圖建立多餘這個值的動態分割槽數目,會引發錯誤 |
hive.exec.max.dynamic.partitions | 1000 | 被一條帶有動態分割槽的SQL語句所能建立的動態分割槽總量,如果超出限制會報出錯誤 |
hive.exec.max.created.files | 100000 | 全域性能被建立檔案數目的最大值,專門有一個hadoop計數器來跟蹤該值,如果超出會報錯 |
舉個例子,使用全動態分割槽的SQL語句序列如下所示,需要先設定一些必要的引數才可以:
1 2 3 4 5 6 7 8 9 |
set
hive.exec.dynamic.partition=true;
相關推薦hive從查詢中獲取資料插入到表或動態分割槽轉自:http://www.crazyant.net/1197.html Hive的insert語句能夠從查詢語句中獲取資料,並同時將資料Load到目標表中。現在假定有一個已有資料的表staged_employees(僱員資訊全量表),所屬國家cnty和所屬州st是該表 Java基礎-----從Excel中獲取資料生成shell指令碼前言 java讀取Excel的驅動包: 連結:https://pan.baidu.com/s/1ejCR9sS2OUmttFYpQnJkKQ 提取碼:58rm 實現1: 從Excel中讀取表名,由於每個欄位會對應一個表名,故讀取的某列會有若干個連續的表名出現,所以用set集合 Hive從HDFS中載入資料建表 以手機流量資訊為例插入30w行資料 create table flow(id string,phonenum string,mac string,ip string,num1 int,num2 int,up in 從表格中獲取資料,並在排序後按順序重新排列表格(Javascript)數字排序出現問題 升序結果出現了一個大的數字反而在小數字的後面 function mySort(arr){ for(var x=0;x<arr.length-1;x++){ for(var y=x+1;y<arr.l hive 從Excel中匯入資料拿到Excel表後將資料保留,其他的亂七八糟都刪掉,然後另存為txt格式的文字,用nodepad++將文字轉換為UTF-8編碼,此處命名為cityprovince.txt 將cityprovince.txt傳入操作的Linux環境中 hive建表,注 使用springmvc從頁面中獲取資料,然後根據獲得的引數資訊進行修改,如果修改的資料中含有不是基本資料型別的引數。比如傳的引數中有Date型別的資料時,需要我們進行引數型別轉換。1.1 需求 在商品修改頁面可以修改商品的生產日期,並且根據業務需求自定義日期格式。 1.2 需求分析 由於日期資料有很多格式,所以springmvc沒辦法把字串轉換成日期型別。所以需要自定義引數繫結。前端控制器接收到請求後,找到註解形式的處理器介面卡,對RequestMapping標記的方法進 1.簡單例項:ASP.NET下Echarts通過Ajax從資料庫中獲取資料後臺:Test01.ashx.cs:從資料庫獲取資料,通過HTTP請求(HttpContext)實現和前臺資料傳遞json資料 using System; using System.Collections.Generic; using System.Linq; using ASP.NET+Echarts+Ajax從資料庫中獲取資料html <div class="panel-body"> <div id="signNum" style="height: 400px; width: 使用localStorage解決瀏覽器重新整理後無法再從vuex中獲取資料的問題假設有這樣一個場景:使用者登入後,用vuex管理使用者的資訊,登入成功後進入主介面,在進入主介面後重新整理瀏覽器,此時vuex中的使用者資訊將無法獲取到。那麼應該如何解決?辦法之一是使用localStorage儲存使用者資訊。在登入成功後儲存使用者資訊,重新整理瀏覽器後從lo Http Get 從伺服器中獲取資料 儲存到本地package com.http.get; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConn Jmeter-從資料庫中獲取資料並作為變數傳輸再今天重新學習,從資料庫中取資料,並作為變數傳到下一個請求中。 首先第一步要匯入mysql驅動包 一、新增JDBC Connection Configuration 設定連結 Database URL: jdbc:mysql:// 資料庫地址 /庫名 JDBC Driver class:com.my 是用JDBC從資料庫中獲取資料並以java物件返回/** * * @param c * for example Person.class * @param primaryKeys * primaryKeys為主鍵,引數順序和表中保持一致 如果id, name 用Java程式碼從網頁中獲取資料(示例程式碼)package com.mashensoft.net; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java php從資料庫中獲取資料用ajax傳送到前臺1、資料庫的欄位: 2、php連線資料庫獲取資料庫的資訊放入json_encode($css);{檔案為:db.php} <span style="font-size:14px;"><?php $host="localhost"; $username= Spark Streaming從Kafka中獲取資料,並進行實時單詞統計,統計URL出現的次數1、建立Maven專案 2、啟動Kafka 3、編寫Pom檔案 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.or C#從sqlserver中獲取資料的方法使用sqlCommand 建立一個連線的命令 再向其中的CommandText中賦值要進行了操作語句指令碼 用SqlDataAdapter獲取返回值,並將其複製到一個datatable中 從dat 從plist中獲取資料賦給字典NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"book" ofType:@"plist"]; NSDictionary Android 根據從伺服器中獲取的rgb值實現動態改變圓角加框的Imageview 的背景色先上圖,效果圖如上。 本來考慮用facebook的SimpleDraweeView 來實現圓角加框的,但並非所有的圖片分支部分都可以實現圓角,目前只有佔位圖片和實際圖片可以實現圓角。 後來使用自定義的的控制元件RoundImageView來實現圓角加框,那麼問題來了。 sql insert into 一次性插入多條資料 從一張表中查詢到的資料插入到另一張表--插入多條資料使用DEFAULT關鍵字(第二種方法,不要將預設列名寫出,在UNION後面加上all,最後一行不加) ------------------------------------------------------------------------------ 從hive中獲取資料MySQL中獲取資料 public RestMsg<Object> getZhen( HttpServletRequest request) { RestMsg<Object> rm = new RestMsg<Object>(); |