Hive列转行函数

    科技2022-07-11  98

    Hive列转行函数

    select split("a,b,c,d",',');

    效果:

    select explode(split("a,b,c,d",','));

    效果:

    案例:

    原始数据

    moviecategory《疑犯追踪》悬疑,动作,科幻,剧情《Lie to me》悬疑,警匪,动作,心理,剧情《战狼2》战争,动作,灾难

    需求

    《疑犯追踪》 悬疑 《疑犯追踪》 动作 《疑犯追踪》 科幻 《疑犯追踪》 剧情 《Lie to me》 悬疑 《Lie to me》 警匪 《Lie to me》 动作 《Lie to me》 心理 《Lie to me》 剧情 《战狼2》 战争 《战狼2》 动作 《战狼2》 灾难

    实现 第一步,炸开类型

    select explode(split(category,',')) from movie_info;

    实现第二步:尝试使用join进行连接,但是不行,没有办法写join条件,造成了笛卡尔积

    SELECT t1.movie, t2.category_name from ( select movie from movie_info ) t1 left join ( select explode(split(category,',')) category_name from movie_info ) t2;

    实现第三步:

    我们的需求是·想让炸开后的临时表和炸开之前表所在行的其他字段进行join

    hive帮我们实现了这个需求 lateral view (侧写视图)

    select movie, category_name from movie_info LATERAL VIEW explode(split(category,',')) tmp as category_name;

    一定要写表别名和列别名

    效果:

    LATERAL VIEW

    用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

    解释:lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

    lateral view首先为原始表的每行调用UDTF,UTDF会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表。

    Processed: 0.035, SQL: 8