• hive的行列转换


    需求:

    《疑犯》 悬疑,动作,科幻,爱情
    《lie to me》 悬疑,警匪,动作,心理,剧情
    《战狼》 战争,动作,灾难

    转成如下格式:

    《疑犯》 悬疑
    《疑犯》 动作
    《疑犯》 科幻
    《疑犯》 爱情
    《lie to me》 悬疑
    《lie to me》 警匪
    《lie to me》 动作
    《lie to me》 心理
    《lie to me》 剧情
    《战狼》 战争
    《战狼》 动作
    《战狼》 灾难

    思路解析:

    explode函数:处理map结构的字段,将数组转换成多行

    step1:建表movie_info:

    --对电影的风格使用数组,所以建表时要标明数组的分隔符语句  ——  collection items terminated by ","
    create table movie_info(
        movie string,
        category array<string>)
    row format delimited 
    fields terminated by "\t"
    collection items terminated by ","; 
    
    -- 插入数据
    load data local inpath "/movie_info.txt" into table movie_info;
    

    查询表格:

    select * from movie_info;
    

    此时可以看到category是一个数组,并且分隔符为",";

    step2:explode的使用:

    explode作用:处理map结构的字段,将数组转换成多行

    所以我们现在先对category使用category函数:

    select explode(category) from movie_info;
    

    结果:

    如果想要得到题目的需求结果,那么需要在此结果上,每一部电影和该电影对应的category进行笛卡尔积,得到结果:

    如果我们直接

    select  movie,explode(category) from movie_info;
    

    查询直接报错,因为movie的结果只有三条,而explode(category)有 4 + 5 + 3 = 12条记录。

    那么,我们由此引入LATERAL VIEW函数:

    LATERAL VIEW:

    1.Lateral View 用于和UDTF函数【explode,split】结合来使用。
    2.首先通过UDTF函数将数据拆分成多行,再将多行结果组合成一个支持别名的虚拟表。
    3..主要解决在select使用UDTF做查询的过程中查询只能包含单个UDTF,不能包含其它字段以及多个UDTF的情况。
    4.语法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)

    使用LATERAL VIEW + explode 函数进行查询,语句如下:

    select movie,category_name 
    from movie_info
    LATERAL VIEW explode(category) tmpTable as category_name;
    -- category_name 是给 explode(category) 列起的别名
    

    结果如下:

    转载于:https://zhuanlan.zhihu.com/p/115913870

  • 相关阅读:
    Game of War
    Unreal Engine 4 性能优化工具(Profiler Tool)
    触屏设备上的多点触碰检测C++代码实现
    独立游戏设计流程:从概念到写码的13个步骤
    ue4 多相机分屏与小地图效果实现教程
    Unreal Engine 4 笔记 2
    3dsMax模型转UE4
    以《西游记》为例 详解游戏设计归纳演绎法
    假期关于产品-设计-逻辑-市场-团队思考节选30篇
    Unreal Engine 4 笔记
  • 原文地址:https://www.cnblogs.com/erlou96/p/16878458.html
Copyright © 2020-2023  润新知