遇到個情況,跑hive級聯insert數據報錯,可以嘗試換個hive計算引擎
hive遇到FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask錯誤
1、配置mapreduce計算引擎 set hive.execution.engine=mr; 2、配置spark計算引擎 set hive.execution.engine=spark; 3、配置tez 計算引擎 set hive.execution.engine=tez;
hive的sql操作與musql些許區別,比如hive沒有group_concat,取而代之的是collect_set;hive不能使用子查詢等,以下是常用操作:
添加分區
ALTER TABLE table_name ADD PARTITION (partCol = 'value1') location 'loc1'; //示例
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (dt='20130101') LOCATION '/user/hadoop/warehouse/table_name/dt=20130101'; //一次添加一個分區
例:
ALTER TABLE $abc$ ADD IF NOT EXISTS PARTITION(p_provincecode=$abc.p_provincecode$,p_year=$abc.p_year$,p_month=$abc.p_month$) LOCATION '/hadoop路徑/p_provincecode=$abc.p_provincecode$/p_year=$abc.p_year$/p_month=$abc.p_month$/'
ALTER TABLE page_view ADD PARTITION (dt='2008-08-08', country='us') location '/path/to/us/part080808' PARTITION (dt='2008-08-09', country='us') location '/path/to/us/part080809'; //一次添加多個分區
刪除分區
ALTER TABLE login DROP IF EXISTS PARTITION (dt='2008-08-08');
ALTER TABLE page_view DROP IF EXISTS PARTITION (dt='2008-08-08', country='us');
修改分區
ALTER TABLE table_name PARTITION (dt='2008-08-08') SET LOCATION "new location";
ALTER TABLE table_name PARTITION (dt='2008-08-08') RENAME TO PARTITION (dt='20080808');
添加列(字段)
ALTER TABLE table_name ADD COLUMNS (col_name STRING); //在所有存在的列后面,但是在分區列之前添加一列
修改列
CREATE TABLE test_change (a int, b int, c int);
/* will change column a's name to a1*/
ALTER TABLE test_change CHANGE a a1 INT;
修改列的順序
ALTER TABLE table_name CHANGE col_old_name col_new_name column_type AFTER column_name;
/* will change column a's name to a1, a's data type to string, and put it after column b. The new table's structure is: b int, a1 string, c int*/
ALTER TABLE test_change CHANGE a a1 STRING AFTER b;
/* will change column b's name to b1, and put it as the first column. The new table's structure is: b1 int, a int, c int*/
ALTER TABLE test_change CHANGE b b1 INT FIRST;
hive刪除字段
ALTER TABLE wireless_union_data_export_part1 REPLACE COLUMNS();
修改表屬性
alter table table_name set TBLPROPERTIES ('EXTERNAL'='TRUE'); //內部表轉外部表
alter table table_name set TBLPROPERTIES ('EXTERNAL'='FALSE'); //外部表轉內部表
表的重命名
ALTER TABLE table_name RENAME TO new_table_name
gbase修改字段只能先刪掉字段,然后再添加
gbase刪除字段
alter table table_name drop 字段名
gbase添加字段
alter table table_name add COLUMN col_name STRING;
gbase清除表數據不刪除表
delete 表名
常用函數
1.isnull(string a) --如果a是null,返回flase,如果啊不為空,返回true
2.ROUND(double a)四舍五入bigint類型
CEILING --舍入到最大整數 3.33舍入到4 2.98舍入到3 -3.61舍入到-3
FLOOR() --舍入到最小整數 3.33舍入到3 2.98舍入到2 -3.61舍入到-4
3.map(key1, value1, key2, value2, …)通過指定的鍵/值對,創建一個map
4.cast(expr as <type>)類型轉換。例如將字符”1″轉換為整數:cast(’1′ as bigint),如果轉換失敗返回NULL。
例:CAST(num*100 AS decimal(8,0)) as num
5.unix_timestamp() --如果不帶參數的調用,返回一個Unix時間戳(從’1970- 01 – 0100:00:00′到現在的UTC秒數)
--指定日期參數調用UNIX_TIMESTAMP(),它返回參數值’1970- 01 – 0100:00:00′到指定日期的秒數
unix_timestamp(string date, string pattern) --指定時間輸入格式,返回到1970年秒數:unix_timestamp(’2009-03-20′, ‘yyyy-MM-dd’) = 1237532400
from_unixtime(bigint unixtime[, string format])
例:select from_unixtime(1505750400,'%Y-%m-%d %H-%i-%S');
--UNIX_TIMESTAMP參數表示返回一個值’YYYY- MM – DD HH:MM:SS’或YYYYMMDDHHMMSS.uuuuuu格式,這取決於是否是在一個字符串或數字語境中
to_date(string timestamp) --返回時間中的年月日: to_date(“1970-01-01 00:00:00″) = “1970-01-01″
to_dates(string date) --給定一個日期date,返回一個天數(0年以來的天數)
year、month、day、hour、minute、second、weekofyear --日期轉年、轉月…………
hour --返回指定時間的小時,范圍為0-23
weekofyear(string date) --返回指定日期所在一年中的星期號,范圍0到53
datediff('string enddate','string startdate') --兩個時間參數的日期之差
DATEDIFF ( date-part, date-expression-1, date-expression-2 ) --返回兩個日期之間的間隔
date-part : year | quarter | month | week | day | hour | minute | second | millisecond
sec_to_time(秒) --將秒轉化成時間
time_to_sec(時間) --將時間轉化為秒
date_add(string startdate,int days) --給定時間,在此基礎上加上指定的時間段
date_sub(string startdate,int days) --給定時間,在此基礎上減去指定的時間段
6.CASE a WHEN b THEN c [WHEN d THEN e]* [ELSE f] END --當a=b時,返回c;當a=d時,返回e,否則返回f
CASE WHEN a THEN b [WHEN c THEN d]* [ELSE e] END --當值為a時返回b,當值為c時返回d。否則返回e
7.concat(string A, string B…) --連接多個字符串,合並為一個字符串,可以接受任意數量的輸入字符串
--任何字符與null連接都是NULL
concat_ws(string SEP, string A, string B…) --帶分隔符字符串連接函數
例如:select concat_ws('_','abc','def','gh') from lxw_dual;返回 abc_def_gh
行轉列,e.g. select concat_ws('_',collect_set(visitor_name))
8.upper(string A) 或者 ucase(string A) --將文本字符串轉換成字母全部大寫形式
9.lower(string A) 或者 lcase(string A) --將文本字符串轉換成字母全部小寫形式
10.trim(string A) --刪除字符串兩端的空格,字符之間的空格保留
ltrim --左邊去空格
rtrim --右邊去空格
11.like --例如:a like b --如果字符串A或者字符串B為NULL,則返回NULL;如果字符串A符合表達式B 的正則語法,則為TRUE;否則為FALSE。
--B中字符”_”表示任意單個字符,而字符”%”表示任意數量的字符。
例如:select aaaaaa like '%aaa%'
12.split(string str, string pat) --將字符串轉換為數組,以pat為分隔
13.substr(string A, int start) 或者 substring(string A, int start) --字符串截取函數,
例:select substr(‘abcde’,3); --返回cde
例:select substring('ancdefghijklmn',4,8); --返回 defghijk
該子字符串從指定的 beginIndex 處開始, endIndex:到指定的 endIndex-1處結束。
14.regexp_extract --正則表達式解析函數 通過下標返回正則表達式指定的部分
regexp_extract(str, regexp[, idx])
其中:
str是被解析的字符串
regexp 是正則表達式
idx是返回結果 取表達式的哪一部分 默認值為1。
0表示把整個正則表達式對應的結果全部返回,1表示返回正則表達式中第一個() 對應的結果 以此類推
例 from
(select distinct id, name, val from text_table
where p_provincecode=12345 and regexp_extract(lower(id),'(@id)$|(@num)(\\d*)$',0) <>''
)a
$ 匹配行結束符;
* 匹配0或多個正好在它之前的那個字符;重復零次或多次
\ 這是引用符,用來將這里列出的這些元字符當作普通的字符來進行匹配;
| 將兩個匹配條件進行邏輯“或”(Or)運算;
\d 匹配數字。在hive這種寫正則表達式需要用\轉義,所以\\d
^ 匹配一行的開始
? 匹配0或1個正好在它之前的那個字符;重復零次或一次
. 匹配除換行符號外的任意字符
15.regexp_replace(string A, string B, string C) --正則表達式替換函數 字符串A中的B字符被C字符替代
regexp_replace(trim(waitbegin), '/', '-')
unix_timestamp(concat_ws(':', regexp_replace(trim(ackbegin), '/', '-'), '00'))-unix_timestamp(concat_ws(':', regexp_replace(trim(waitbegin), '/', '-'), '00')) as wait_duration,
16.get_json_object(string json_string, string path) --json解析函數 解析json的字符串json_string,返回path指定的內容。如果輸入的json字符串無效,那么返回NULL。
17.內置聚合函數 count、sum、avg、min、max
18.left semi join ... on ...--只打印左邊的表中的列,規律是如果主鍵在右邊表中存在,則打印,否則過濾掉
--相當於sql的in
--不會產生重復的多條記錄
19.collect_set --與group by組合能列轉行,相當於group_concat
20.SELECT COALESCE(NULL, NULL, GETDATE()) --由於兩個參數都為null,所以返回getdate()函數的值,也就是當前時間。即返回第一個非空的值。由於這個函數是返回第一個非空的值,所以參數里面必須最少有一個非空的值,如不是,將會報錯
sql:注意問題
1.hive中只有union 沒有union all
union --聯合兩張表(會自動去重,兩張表取出的字段個數和類型必須一致) 並集操作
union all --聯合兩張表的所有數據(不會去重,兩張表取出的字段個數和類型必須一致) 並集操作
2.ABS() --求絕對值
3.與over函數結合的幾個函數介紹
參考網址:http://blog.csdn.net/winer2008/article/details/4283539
row_number()over()、rank()over()和dense_rank()over()函數的使用
row_number() 是沒有重復值的排序(即使兩天記錄相等也是不重復的),可以利用它來實現分頁
dense_rank() 是連續排序,兩個第二名仍然跟着第三名
rank() 是跳躍排序,兩個第二名下來就是第四名
row_number() OVER (PARTITION BY COL1 ORDER BY COL2)
--表示根據COL1分組,在分組內部根據 COL2排序,而此函數計算的值就表示每組內部排序后的順序編號(組內連續的唯一的)
例:row_number() over (partition BY stbid,userid ORDER BY timestamp) AS group_idx,
--over(order by salary range between 5 preceding and 5 following):窗口范圍為當前行數據幅度減5加5后的范圍內的。
sum(s)over(order by s range between 2 preceding and 2 following) 表示加2或2的范圍內的求和
--over(order by salary rows between 5 preceding and 5 following):窗口范圍為當前行前后各移動5行。
sum(s)over(order by s rows between 2 preceding and 2 following)表示在上下兩行之間的范圍內
4.group by 和 having
SELECT A COUNT(B) FROM TABLE GROUP BY A HAVING COUNT(B)>2
5.SemanticException Column xx Found in more than One Tables/Subqueries報錯
Hive中有兩張表中擁有同一個字段名稱,在這兩個表做關聯的時候會報這個錯誤,
如
select a.c, b.c, c.name from A b left join (select count(1) as c,code from B group by code )b on a.code=b.code left join C c on a.code = c.code;
a.c 和c.name的c,hive下含義辨識不清楚,改為如下
select a.c, b.c, cc.name from A b left join (select count(1) as c,code from B group by code )b on a.code=b.code left join C cc on a.code = cc.code;
5.子查詢只能在from后或者where后
6.hive基本數據類型記錄
