• hive的行列转换2


    需求:

    孙悟空 白羊座 A
    沙悟净 射手座 A
    宋松松 白羊座 B
    猪八戒 白羊座 A
    小凤姐 射手座 A

    转换成以下格式:

    白羊座,A 孙悟空|猪八戒
    白羊座,B 宋松松
    射手座,A 沙悟净|小凤姐

    思路:表的行转列

    知识点:concat(string1,string2) string1和string2需要是列名

    -- 使用hive的beeline客户端,使用t_vehicle_log,并查看该表的secma
    ./bin/beeline 
    desc t_vehicle_log;
    

    -- 对其中两列字段进行拼接
    select concat(vehicle_speed,vehicle_plate) from t_vehicle_log;
    

    --concat()  对拼接的两列字符串中间用,连接
    select concat(vehicle_speed,",",vehicle_plate) from t_vehicle_log;
    

    加入我们要拼接多个列,并且需要用同样的分隔符(如A,B,C,D),该怎么做呢?

    ——我们可以使用concat_ws()

    select concat_ws(",",monitor_id,camera_id,vehicle_plate) from t_vehicle_log;
    

    如果某一列有很多重复的字段,我们需要对其进行去重,并对去重字段返回一个数组,该怎么办呢?

    —— 我们可以使用 collect_set()

    select monitor_id from t_vehicle_log;
    

    select collect_set(monitor_id) from t_vehicle_log;
    

    以上为本次需求所需的知识点的讲解,下面开始解决本次需求:

    -- 建表:
    create table person_info(
        name string,
        constellation string,
        blood_type string)
    row format delimited fields terminated by "\t";
    
     
    -- 插数据
    load data local inpath '/person_info.txt' into table person_info;
    
     

    使用concat_ws()查询:

    select concat_ws(",",constellation,blood_type) c_b,name from person_info;
    

    结果:

    对上一步结果作为子查询,在查询:

    select 
        t1.c_b, 
        collect_set(t1.name)
    from(
        select concat_ws(",",constellation,blood_type) c_b,
        name from person_info
    ) t1
    group by t1.c_b;
    

    最终结果:collect_set()返回的是数组,concat_ws()接受的string或者是string数组

    将数组划分开:

    select 
        t1.c_b, 
        concat_ws("|",collect_set(t1.name))
    from(
        select concat_ws(",",constellation,blood_type) c_b,
        name from person_info
    ) t1
    group by t1.c_b;
    

    结果:

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

  • 相关阅读:
    Flink 源码解析 —— 深度解析 Flink 序列化机制
    Flink Metrics 源码解析
    Flink 源码解析 —— JobManager 处理 SubmitJob 的过程
    vue封装插件并发布到npm上
    vue+ivew-admin开发项目,内存占用过大解决办法
    Vue-cli 2.9 多页配置及多页面之间的跳转问题
    vuex2.0 基本使用(3) --- getter
    vuex2.0 基本使用(2) --- mutation 和 action
    vuex2.0 基本使用(1) --- state
    如何新建仓并 上传本地新的项目
  • 原文地址:https://www.cnblogs.com/erlou96/p/16878457.html
Copyright © 2020-2023  润新知