1. 程式人生 > >hive內建UDTF函式

hive內建UDTF函式

  • explode函式:hive內建的表生成函式,主要用於將一行輸入拆分成多行輸出。
官網解釋:explode() takes in an array (or a map) as an input and outputs the elements of the array (map) as separate rows. UDTFs can be used in the SELECT expression list and as a part of LATERAL VIEW. ①建立array資料型別表
hive> create table student_array(
    > name string,
    > course_score array<string>
    > )
    > row format delimited fields terminated by '\t'
    > collection items terminated by ','
    > stored as textfile;
②準備資料student_array.txt
[email protected]:/home/hadoop/dataset# cat student_array.txt
zs	語文:86,數學:87.5,英語:90
ls	語文:76,數學:93,英語:88
ww	語文:88,數學:90,英語:95
③將資料匯入到hive表
hive> load data local inpath '/home/hadoop/dataset/student_array.txt' overwrite into table student_array;
④檢視hive表資料
hive> select * from student_array;
-chgrp: '*' does not match expected pattern for group
Usage: hadoop fs [generic options] -chgrp [-R] GROUP PATH...
OK
zs	["語文:86","數學:87.5","英語:90"]
ls	["語文:76","數學:93","英語:88"]
ww	["語文:88","數學:90","英語:95"]
對於array資料型別,explode函式將陣列中的元素拆分,按行輸出每個元素
hive> select explode(course_score) from student_array;
-chgrp: '*' does not match expected pattern for group
Usage: hadoop fs [generic options] -chgrp [-R] GROUP PATH...
OK
語文:86
數學:87.5
英語:90
語文:76
數學:93
英語:88
語文:88
數學:90
英語:95
posexplode函式類似於explode函式,只是在返回陣列中的元素同時也返回元素在陣列中的索引位置
hive> select posexplode(course_score)   from  student_array;
-chgrp: '*' does not match expected pattern for group
Usage: hadoop fs [generic options] -chgrp [-R] GROUP PATH...
OK
0	語文:86
1	數學:87.5
2	英語:90
0	語文:76
1	數學:93
2	英語:88
0	語文:88
1	數學:90
2	英語:95
對於map資料型別,explode函式會將一個map資料型別拆分成兩列輸出,鍵一列,值一列。 首先建立帶map的表
hive> create table student_map(
    > name string,
    > course_score map<string ,float>
    > )
    > row format delimited fields terminated by '\t'
    > collection items terminated by ','
    > map keys terminated by ':'
    > stored as textfile;
hive> select * from student_map;
-chgrp: '*' does not match expected pattern for group
Usage: hadoop fs [generic options] -chgrp [-R] GROUP PATH...
OK
zs	{"語文":86.0,"數學":87.5,"英語":90.0}
ls	{"語文":76.0,"數學":93.0,"英語":88.0}
ww	{"語文":88.0,"數學":90.0,"英語":95.0}
explode函式將map資料型別的資料鍵值對拆分長兩列
hive> select explode(course_score) from student_map;
-chgrp: '*' does not match expected pattern for group
Usage: hadoop fs [generic options] -chgrp [-R] GROUP PATH...
OK
語文	86.0
數學	87.5
英語	90.0
語文	76.0
數學	93.0
英語	88.0
語文	88.0
數學	90.0
英語	95.0
posexplode函式的引數只能是陣列,不能是map資料型別
hive> select posexplode(course_score) from student_map;
FAILED: UDFArgumentException posexplode() takes an array as a parameter
對於結構體陣列,可以使用inline函式進行拆分
hive> select * from student_struct_array;
-chgrp: '*' does not match expected pattern for group
Usage: hadoop fs [generic options] -chgrp [-R] GROUP PATH...
OK
zs	[{"course":"語文","score":86.0},{"course":"數學","score":87.5},{"course":"英語","score":90.0}]
ls	[{"course":"語文","score":76.0},{"course":"數學","score":93.0}]
ww	[{"course":"語文","score":88.0},{"course":"數學","score":90.0},{"course":"英語","score":95.0}]
Time taken: 0.19 seconds, Fetched: 3 row(s)
hive> select inline(course_score) from student_struct_array;
-chgrp: '*' does not match expected pattern for group
Usage: hadoop fs [generic options] -chgrp [-R] GROUP PATH...
OK
語文	86.0
數學	87.5
英語	90.0
語文	76.0
數學	93.0
語文	88.0
數學	90.0
英語	95.0
在select語句中使用UDTF語法的限制: ①在select語句中只支援單個UDTF表示式 ②不支援UDTF巢狀 ③不支援GROUP BY / CLUSTER BY / DISTRIBUTE BY / SORT BY語句
hive> select explode(name) , explode(course_score) from student_array;
FAILED: SemanticException 1:23 Only a single expression in the SELECT clause is supported with UDTF's. Error encountered near token 'course_score'
hive> select explode(name) , explode(course_score) from student_array;
FAILED: SemanticException 1:23 Only a single expression in the SELECT clause is supported with UDTF's. Error encountered near token 'course_score'
hive> select name ,explode(course_score) from student_array;
FAILED: SemanticException [Error 10081]: UDTF's are not supported outside the SELECT clause, nor nested in expressions
hive> select explode(course_score) from student_array sort by name;
FAILED: SemanticException [Error 10078]: SORT BY is not supported with a UDTF in the SELECT clause
explode函式和lateral view結合使用,就不存在上上語法限制
hive> select name ,course ,score from student_struct_array  lateral view inline(course_score)  course_scores as course , score ;
-chgrp: '*' does not match expected pattern for group
Usage: hadoop fs [generic options] -chgrp [-R] GROUP PATH...
OK
zs	語文	86.0
zs	數學	87.5
zs	英語	90.0
ls	語文	76.0
ls	數學	93.0
ww	語文	88.0
ww	數學	90.0
ww	英語	95.0
lateral view outer 使用方法
hive> select * from student_array lateral view outer explode(array())  c as a;
-chgrp: '*' does not match expected pattern for group
Usage: hadoop fs [generic options] -chgrp [-R] GROUP PATH...
OK
zs	["語文:86","數學:87.5","英語:90"]	NULL
ls	["語文:76","數學:93","英語:88"]	NULL
ww	["語文:88","數學:90","英語:95"]	NULL
Time taken: 0.166 seconds, Fetched: 3 row(s)





相關推薦

hiveUDTF函式

explode函式:hive內建的表生成函式,主要用於將一行輸入拆分成多行輸出。官網解釋:explode() takes in an array (or a map) as an input and outputs the elements of the array (ma

Hive聚合函式

聚合函式 下表為Hive內建的聚合函式。 返回型別 函式名 描述 BIGINT count(*) count(expr) count(DISTINCT expr[, expr_.]) count(*) – 返回檢索到的行的總數,包括

hive 函式

在Hive中,函式包括以下型別: 一、內建函式 1、數學函式 [plain] view plain copy print? (1)round:四捨五入 select round(數值,小數點位數); (2)ceil:向上取整 sel

大資料入門教程系列之Hive函式及自定義函式

本篇文章主要介紹Hive內建函式以及自定義UDF函式和UDFT函式,自定義UDF函式通過一個國際轉換中文的例子說明。 操作步驟: ①、準備資料和環境 ②、演示Hive內建函式 ③、自定義UDF函式編寫、演示   詳細步驟: 一、準備資料和

大資料系列之hive(八、hive函式全解)

1.內建運算子1.1關係運算符 運算子 型別 說明 A = B 所有原始型別 如果A

hive函式

• 正則表示式解析函式: regexp_extract 語法: regexp_extract(string subject, string pattern, int index) 返回值: string 說明:將字串subject按照pattern正則表示式的規則拆分,返回index

Hive 函式及自定義函式

1.內建函式 使用如下命令檢視當前hive版本支援的所有內建函式 show functions; 部分截圖: 可以使用如下命令檢視某個函式的使用方法及作用,比如檢視 upper函式 desc function upper; 如果想要檢

Hive函式(測試函式小技巧)

內容較多,見《Hive官方文件》   主要是字串操作函式測試各種內建函式的快捷方法:1、建立一個dual表create table dual(id string);2、load一個檔案(一行,一個空格)到dual表3、select substr('angelababy',2,

Spark SQL 支援的Hive函式

數學函式 round bround floor ceil rand exp log pow sqrt bin hex unhex abs pmod sin asin cos acos tan ata

Hive 函式和UDF函式

1)內建函式    hive> show functions;    // 顯示所有函式,比官網詳細    hive> desc function substr;    // 檢視函式的詳細資訊    hive> desc function extended

hive函式和自定義函式的使用

1.hive函式的分類 內建函式和自定義函式 1.1、內建函式 1、查詢有哪些內建函式: show functions;2、查詢某個內建函式怎麼使用desc function extended concat;1.2、自定義函式 分三大類:1、UDF : user defin

hive函式大全

一、檢視函式        show functions 顯示hive下內建所有函式        desc function extended add_months 顯示add_months 函式用法

python--next()函式

我們首先要知道什麼是可迭代的物件(可以用for迴圈的物件)Iterable: 一類:list,tuple,dict,set,str 二類:generator,包含生成器和帶yield的generatoe function 而生成器不但可以作用於for,還可以被next()函式不斷

易學筆記-第5章:數字/5.3 數字工具/5.3.2 數學函式

內建數學函式 pow:運算次方 abs:求絕對值 round:四捨五入保留N位小數 >>> a=1.235        >>> round(a,2)  &nbs

javascript之複用建構函式

有時,我們可能想要建立一個物件,該物件包含一組資料。如果僅僅是集合,我們可以使用陣列。但是有時,需要儲存 更多狀態,可能就需要儲存更多集合相關的元資料。 一種方式是建立這類物件的新版本,新增元資料屬性和方法,我們可以在物件上新增屬性和方法,包括陣列。然而這種方法效率低,且單調乏味。 我們如何

Fanuc Karel 函式

--------------------------------------------- -- 時間:2018-12-04 -- 建立人:Ruo_Xiao -- 郵箱:[email protected] ----------------------------------------

Hiverow_number

語法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 簡單的說row_number()從1開始,為每一條分組記錄返回一個數字,這裡的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再為降

python基礎--生成器(續),高階函式

生成器示例 def create_num(all_num): print('-----1-------') a, b = 0, 1 current_num = 0 while current_num < all_nu

python中常見的高階函式

常見的內建高階函式:map,reduce,filter,sorted 在python3中,reduce已經不算是內建函數了,據說是因為龜叔不喜歡map / reduce這樣的內建函式,但是在社群的極

python-高階函式

1.map map()函式接收兩個引數,一個是函式,一個是序列 map將傳入的函式依次作用到序列的每個元素,並且把結果 作為新的序列返回 #求絕對值: print((map(abs,[-1,3,-4,-5]))) 輸出: <map object at 0x7f2aef1e5208&