首页 > 其他分享 >Hive / ClickHouse 行转列函数 collect_set() / groupUniqArray() 入门

Hive / ClickHouse 行转列函数 collect_set() / groupUniqArray() 入门

时间:2023-11-02 15:03:43浏览次数:32  
标签:set 函数 Hive groupUniqArray collect 数组 技能

Hive / ClickHouse 行转列函数 collect_set() / groupUniqArray() 入门

在数据处理和分析中,我们经常会遇到需要将一行数据转换为多列的情况。在 Hive 和 ClickHouse 中,可以使用 collect_set()groupUniqArray() 函数来实现行转列操作。

collect_set()

1. 功能说明 collect_set() 函数用于将一列的数据转换为一个无重复元素的数组。 2. 语法

sqlCopy codecollect_set(column_name)

3. 示例 假设我们有一个包含学生姓名及其对应的科目的表格。

学生姓名

科目

张三

数学

张三

英语

李四

数学

李四

物理

李四

化学

王五

英语

使用 collect_set() 函数可以将同一个学生的科目转换为数组。

sqlCopy codeSELECT
    学生姓名,
    collect_set(科目) AS 科目列表
FROM
    学生成绩表
GROUP BY
    学生姓名;

输出结果为:

学生姓名

科目列表

张三

[数学, 英语]

李四

[数学, 物理, 化学]

王五

[英语]

groupUniqArray()

1. 功能说明 groupUniqArray() 函数用于将多列数据转换为一个无重复元素的数组。 2. 语法

sqlCopy codegroupUniqArray(column1, column2, ...)

3. 示例 假设我们有一个包含学生姓名、科目和对应成绩的表格。

学生姓名

科目

成绩

张三

数学

80

张三

英语

90

李四

数学

85

李四

物理

70

李四

化学

95

王五

英语

88

使用 groupUniqArray() 函数可以将同一个学生的科目和成绩转换为数组。

sqlCopy codeSELECT
    学生姓名,
    groupUniqArray(科目, 成绩) AS 科目成绩列表
FROM
    学生成绩表
GROUP BY
    学生姓名;

输出结果为:

学生姓名

科目成绩列表

张三

[[数学, 80], [英语, 90]]

李四

[[数学, 85], [物理, 70], [化学, 95]]

王五

[[英语, 88]]

以上就是在 Hive 和 ClickHouse 中使用 collect_set()groupUniqArray() 函数实现行转列操作的介绍和示例。通过这些函数,我们可以方便地进行数据聚合和分析工作。

假设我们有一个订单表,记录每个用户购买的商品信息。

订单ID

用户ID

商品名称

1

1001

商品A

1

1001

商品B

1

1002

商品A

2

1002

商品C

2

1003

商品A

2

1003

商品C

使用 collect_set() 函数可以将每个用户购买的商品名称转换为一个数组:

sqlCopy codeSELECT
    用户ID,
    collect_set(商品名称) AS 购买的商品列表
FROM
    订单表
GROUP BY
    用户ID;

输出结果为:

用户ID

购买的商品列表

1001

["商品A", "商品B"]

1002

["商品A", "商品C"]

1003

["商品A", "商品C"]

假设我们有一个用户表,记录每个用户的技能和对应的级别。

用户ID

技能

级别

1001

技能A

初级

1001

技能B

中级

1002

技能A

中级

1002

技能C

高级

1003

技能A

初级

1003

技能C

高级

使用 groupUniqArray() 函数可以将每个用户的技能和级别转换为一个数组:

sqlCopy codeSELECT
    用户ID,
    groupUniqArray(技能, 级别) AS 技能级别列表
FROM
    用户表
GROUP BY
    用户ID;

输出结果为:

用户ID

技能级别列表

1001

[["技能A", "初级"], ["技能B", "中级"]]

1002

[["技能A", "中级"], ["技能C", "高级"]]

1003

[["技能A", "初级"], ["技能C", "高级"]]

以上就是在 Hive 和 ClickHouse 中使用 collect_set() 和 groupUniqArray() 函数实现行转列操作的介绍和示例。通过这些函数,可以方便地进行数据聚合和分析工作。

collect_set() 函数的缺点:

  1. 不保留原始数据的顺序:collect_set() 函数将数据转换为一个无重复元素的数组,但不保留原始数据的顺序。这对于一些需要按照特定顺序分析数据的场景可能不适用。
  2. 数组类型限制:collect_set() 函数将数据转换为一个数组,但数组中的元素必须是相同类型的。如果原始数据中存在不同类型的元素,则无法正确转换。
  3. 只能应用于单列数据:collect_set() 函数只能将一列数据转换为一个数组,无法处理多列数据转换的需求。

groupUniqArray() 函数的缺点:

  1. 只能应用于多列数据转换:groupUniqArray() 函数是将多列数据转换为一个无重复元素的数组,无法处理单列数据转换的需求。
  2. 数组类型限制:与 collect_set() 类似,groupUniqArray() 函数要求转换后的数组中的元素必须是相同类型的。

类似的函数:

  1. collect_list() 函数:与 collect_set() 类似,collect_list() 函数用于将一列数据转换为一个数组,但不去重。
  2. array_agg() 函数:在 PostgreSQL 中,array_agg() 函数可以将一列数据转换为一个数组,并且可以选择是否去重。
  3. pivot() 函数:在 SQL 中,pivot() 函数可以将一列数据透视为多列数据,类似于将行转列的功能,但需要使用动态 SQL。 这些函数都可以用于数据的聚合和分析,具体选择哪个函数取决于实际需求和所使用的数据库。


标签:set,函数,Hive,groupUniqArray,collect,数组,技能
From: https://blog.51cto.com/u_15702012/8146982

相关文章

  • Not creating XLA devices, tf_xla_enable_xla_devices not set TypeError: 'mod
     2021-02-2622:54:13.146272:Itensorflow/core/common_runtime/gpu/gpu_device.cc:1406]CreatedTensorFlowdevice(/job:localhost/replica:0/task:0/device:GPU:0with2989MBmemory)->physicalGPU(device:0,name:GeForceGTX1050,pcibusid:0000:01:0......
  • python中setup.py怎么使用(部署工具)
    `setup.py`是一个用于构建和安装Python包的脚本。它是用于打包、发布和分发你的Python项目的关键文件之一。以下是使用`setup.py`的一般步骤:1.创建`setup.py`文件:在项目的根目录下创建一个名为`setup.py`的文本文件。2.导入`setuptools`模块:在`setup.py`文件......
  • 基于Redis的Set、Zset类型实现好友关注,共同好友(求并集)
    好友关注@OverridepublicResultfollow(LongfollowUserId,BooleanisFollow){//1.获取登录用户LonguserId=UserHolder.getUser().getId();Stringkey="follows:"+userId;//1.判断到底是关注还是取关if(isFollow)......
  • Pset_SiteCommon
    Pset_SiteCommon站点公用:IfcSite所有引用的定义公用的属性。请注意,几个站点属性在IfcSite实例中直接处理,站点编号(或短名称)由IfcSite.name处理,站点名称(或长名称)由IfcSite.LongName处理,描述(或注释)由IfcSite.description处理。土地所有权编号也作为显式属性IfcSite.LandTitleNumber......
  • Error loading wikitext data raise NotImplementedError(f"Loading a dataset cached
    ErrorloadingwikitextdataraiseNotImplementedError(f"Loadingadatasetcachedina{type(self._fs).name}isnotsupported.")QAIwastryingtoloadthewikidataset,butigotthiserrortraindata=load_dataset('wikitext','......
  • 【软硬件环境与工具使用】setuptools模块
    前言  1)setuptools之setup函数参数详解BuildingandDistributingPackageswithSetuptools-setuptools68.0.0.post20230808documentationPython库打包分发(setup.py编写)简易指南|Huoty'sBlogsetup.py实现C++扩展和python库编译_pythonsetup.py编译_ming7771的博客f......
  • 基于Redis的ZSET数据类型实现点赞排行榜
    点赞排行榜(ZSET实现)实现原理:使用redis的zset进行存储,score为当前时间,值为用户IDpublicResultlikeBlog(Longid){//1.获取登录用户LonguserId=UserHolder.getUser().getId();//2.判断当前登录用户是否已经点赞Stringkey=BLOG_LIKED_KEY+id;Doublescore=stringR......
  • map和set的使用
    序列式容器和关联性容器首先序列式容器和我们之前学的线性表很相似,序列式容器的功能就只是单纯的储存数据。序列式容器例如:vactor/list/deque等等而关联式容器则并不单纯的储存数据,数据之间式存在关联关系的,有了这个关联关系我们才能更好地去做查找。关联式容器由map/set等等。两者......
  • getter/setter(访问器/设置器)
    classStudent{privateintid;privateStringname;Student(intid,Stringname){this.id=id;this.name=name;}publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;......
  • Java 通过collectors.groupingBy根据某个字段统计
    要使用Collectors.groupingBy根据某个字段统计,你可以通过提供一个函数来指定分组的条件。假设你有一个包含Person对象的列表,每个对象都有age字段表示年龄,你想要根据年龄分组,并统计每个年龄组的人数。以下是一个使用Collectors.groupingBy的示例代码:importjava.util.Arrays;imp......