Hive-行转列,列转行

  collect_set () – 去重collect_list (split(str)) 这两个都是聚合函数 将收集的多行数据聚集成一个数组集合

  concat (串,符,串。。。。。)拼接 参数是可变参数 拼接字符串

  concat_ws(符,数组/map) 参数一 拼接符 参数二 可变个数的字符串 数组 数据:

  建表:

  按星座和血型分组,并用concat()将姓名拼接:

  结果:

  ±-------±----------------+

  | _c0 | _c1 |

  ±-------±----------------+

  | 处女座,B | [“慧慧”,“奔奔”] |

  | 射手座,A | [“老娜”,“taoge”] |

  | 白羊座,A | [“gangge”] |

  ±-------±----------------+

  用concat_ws()将拼接得到的数组变成字符串,以此实现姓名从列到行的转换;

  数据:

  《八佰》 战争

  《八佰》 动作

  《八佰》 抗日

  《八佰》 剧情

  《姜子牙》 动画

  《姜子牙》 神话

  《姜子牙》 科幻

  《姜子牙》 动作

  《姜子牙》 伦理

  《战狼2》 战争

  《战狼2》 动作

  《战狼2》 灾难

  建表:

  按电影名分组,并将电影类型从列转行拼接在一起,起个别名categorys

  结果:

  ±-------±----------------+

  | name | categorys |

  ±-------±----------------+

  | 《八佰》 | 战争,动作,抗日,剧情 |

  | 《姜子牙》 | 动画,神话,科幻,动作,伦理 |

  | 《战狼2》 | 战争,动作,灾难 |

  ±-------±----------------+

  创建新表,将转换好的数据导入到新的表中得到基础数据,用以完成 行–> 列的操作

  首先将行中电影属性切割存于数组用到split()函数

  结果:

  ±-------±----------------------------+

  | name | _c1 |

  ±-------±----------------------------+

  | 《八佰》 | [“战争”,“动作”,“抗日”,“剧情”] |

  | 《姜子牙》 | [“动画”,“神话”,“科幻”,“动作”,“伦理”] |

  | 《战狼2》 | [“战争”,“动作”,“灾难”] |

  ±-------±----------------------------+

  使用explode()函数完事数组炸裂,将属性categorys由数组–>一列 的操作

  结果:

  侧窗口函数 类似隐式 join 完成电影名和炸雷开的属性的拼接

  转换

  select

  name ,

  tp

  from

  tb_movie2

  lateral view

  explode(split(categorys , ‘,’)) t as tp ;-- t 表名 炸开的一列看成一个虚拟表, tp 虚拟表的字段名