需求:
转变为如下图格式
先建表
create table movie(name string,category string) row format delimited fields terminated by 't';
导入数据
load data local inpath '/home/hadoop/data/movie.txt' into table movie;
直接需求用explode函数直接对category操作试试
报错:
FAILED: UDFArgumentException explode() takes an array or a map as a parameter
提示explode函数要用数组或者map类型传入。这里想到了split函数
split函数:split(string str, string pat),按照pat分割str
select split(category,",") from movie;
得到数组,再用explode试试
select explode(split(category,",")) from movie;
成功一行转多列,但名字没查找,在select添加name试试
select name,explode(split(catelogy,",")) from movie;
报错:
SemanticException [Error 10081]: UDTF's are not supported outside the SELECt clause, nor nested in expressions
原因是name只有3列,而catelogy使用explode函数后,分成了12列,远远大于原来所对应的name的列数
这里使用了lateral view函数
select name, catelogy_name from movie lateral view explode(split(category,",")) movie_temp as catelogy_name
这里的movie_temp是侧写表的别名,catelogy_name是使用explode函数后的别名。
lateral view实际上的操作可以认为是做了一次笛卡尔积。如图:
即得到所需结果



