开发者社区 > 大数据与机器学习 > 大数据计算 MaxCompute > 正文

大数据计算MaxCompute collect_set(字段A) as 字段B 怎么取字段B?

大数据计算MaxCompute collect_set(字段A) as 字段B
怎么取字段B的值,例如:想确定 字段B里是否含有值2
咋写?我尝试了下 EXPLODE(字段B) = 2 会报错,failed: ODPS-0130071:[43,9] Semantic analysis exception - invalid operand type(s) struct,STRING for operator '='ODPS-0130071:[43,9] Semantic analysis exception - UDTF's are not supported outside the SELECT clause, nor nested in expressions

展开
收起
真的很搞笑 2023-10-12 12:52:13 96 0
7 条回答
写回答
取消 提交回答
  • collect_set函数是MaxCompute中的一个聚合函数,它可以将指定字段的值进行去重,并将不同的值合并成一个数组。

    2023-10-13 17:16:24
    赞同 展开评论 打赏
  • 在MaxCompute中,COLLECT_SET函数会将同一组的值收集到一个集合中。如果你想确定集合中是否包含某个值,你可以使用CONTAINS函数。以下是一个基本的示例:

    SELECT CONTAINS(collect_set(字段A), 2);
    

    在这个查询中,CONTAINS函数会检查collect_set(字段A)集合中是否包含值2。

    EXPLODE函数,这是一个用于处理嵌套结构的函数,通常用于处理数组或集合。但是,对于普通的集合(例如由COLLECT_SET函数生成的集合),EXPLODE函数并不会起作用,因为它们并没有内部的结构可以展开。这就是为什么你会收到"invalid operand type(s) struct,STRING for operator '='"的错误信息,因为这个错误信息表示你在对一个结构和一个字符串进行比较。

    2023-10-13 09:00:00
    赞同 展开评论 打赏
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    在 MaxCompute 中,COLLECT_SET 函数用于收集某个字段的所有不同值,并将这些值组成一个集合。当使用 COLLECT_SET 函数时,会生成一个新列,该列的名称由 as 关键字指定,收集后的结果以数组的形式存储。

    如果需要在 MaxCompute SQL 中判断一个数组中是否包含某个元素,可以使用 ARRAY_CONTAINS 函数。该函数用于判断一个数组中是否包含特定的值,返回一个布尔类型的值,表示是否存在该元素。

    例如,假设 collect_set(字段A) as 字段B 收集了一个名为 字段B 的数组,你想要确定其中是否包含值为 2 的元素,可以使用以下 SQL 语句:

    SELECT ARRAY_CONTAINS(字段B, 2) AS is_contain FROM your_table;
    

    其中,ARRAY_CONTAINS 函数的第一个参数是待检查的数组(在本例中即为 字段B),第二个参数是需要查找的元素(在本例中即为 2)。执行上述查询语句后,会得到一个名为 is_contain 的列,该列的值为 true 或 false,表示 字段B 数组是否包含值为 2 的元素。

    2023-10-12 18:37:56
    赞同 展开评论 打赏
  • 在 MaxCompute 中,使用 collect_set() 函数可以将字段A中的值收集到一个数组字段B中。如果您想确定字段B中是否包含特定的值(例如2),您可以使用 array_contains() 函数。

    以下是一个示例查询,展示了如何使用 collect_set()array_contains() 进行判断:

    -- 假设有一个名为 your_table 的表,其中包含字段A和字段B
    
    -- 使用 collect_set() 收集字段A的值到字段B
    SELECT collect_set(A) AS B FROM your_table;
    
    -- 判断字段B中是否包含值2
    SELECT array_contains(B, 2) AS contains_2 FROM (
      SELECT collect_set(A) AS B FROM your_table
    ) t;
    

    在这个示例中,第一个查询通过 collect_set() 将字段A的值收集到字段B中。然后,在第二个查询中,使用 array_contains() 函数来判断字段B中是否包含值2,并将结果存储在一个名为 contains_2 的列中。

    2023-10-12 17:21:42
    赞同 展开评论 打赏
  • COLLECT_SET 将colname指定的列值聚合为一个无重复元素的数组。此函数为MaxCompute 2.0扩展函数。
    https://help.aliyun.com/zh/maxcompute/user-guide/collect-set?spm=a2c4g.11186623.0.i60

    在MaxCompute中,collect_set函数是一个聚合函数,用于将某列的值收集成一个集合,而这个函数的结果是一个字符串。如果你想检查这个集合中是否包含某个特定的值,如"2",你不能直接使用等于操作符=进行比较,因为这是一个集合,而不是单个字符串。

    MaxCompute并没有提供内建的函数来直接检查一个集合是否包含某个值。但你可以使用EXISTS关键字来实现这个功能。以下是一个示例查询,检查由collect_set函数生成的集合中是否存在值"2":

    SELECT COUNT(*) > 0 
    FROM (
      SELECT COUNT(*) as cnt 
      FROM table_name 
      WHERE EXISTS (
        SELECT 1 
        FROM TABLE.COLLECT_SET(字段A) as 字段B_set 
        WHERE 字段B_set = '2'
      )
    ) t
    

    在这个查询中,我们首先从包含collect_set函数的表中选择所有行,然后对每一行,我们检查collect_set函数的输出中是否存在值"2"。如果存在,COUNT(*)的计数就会增加。最后,我们检查这个计数是否大于0,以确定collect_set函数的输出中是否存在值"2"。

    2023-10-12 13:45:45
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    在MaxCompute中,collect_set()函数用于将一组数据合并为一个集合。collect_set()函数返回的是一个包含集合元素的结构化数组。
    如果您想查询collect_set()函数的结果是否包含特定的值,可以使用IN关键字和explode()函数。以下是一个示例:

    SELECT 
        count(*) as num_rows, 
        collect_set(fieldA) as fieldB 
    FROM 
        table 
    GROUP BY 
        collect_set(fieldA) 
    HAVING 
        fieldB IN (2);
    

    这个查询将返回一个结果集,其中包含两个列:num_rowsfieldBnum_rows列包含fieldA字段中不同值的数量,fieldB列包含fieldA字段中所有值的集合。HAVING子句用于过滤结果集,只包含fieldB列中包含值2的行。
    请注意,explode()函数用于将结构化数组转换为多行。在这个查询中,explode()函数用于将fieldB列中的集合元素转换为多行,以便可以使用IN关键字查询这些元素。
    如果您想使用IN关键字查询collect_set()函数的结果,需要确保collect_set()函数返回的是一个包含集合元素的结构化数组。如果collect_set()函数返回的是其他类型的值,那么您可能需要使用其他方法来查询这些值。

    2023-10-12 13:11:46
    赞同 展开评论 打赏
  • 用explode应该是可以的。看报错是数据类型的问题。EXPLODE参数是map或者array
    你试试case when呢,此回答整理自钉群“MaxCompute开发者社区2群”

    2023-10-12 13:01:16
    赞同 展开评论 打赏
滑动查看更多

MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。

相关产品

  • 云原生大数据计算服务 MaxCompute
  • 相关电子书

    更多
    Data+AI时代大数据平台应该如何建设 立即下载
    大数据AI一体化的解读 立即下载
    极氪大数据 Serverless 应用实践 立即下载