让决策更智能
新一代智能数据分析平台

Spark SQL 数组(Array)处理函数及应用

观小远发表于:2021年10月12日 15:09:29更新于:2021年10月12日 17:17:05

      数组(Array)是有序的元素序列,组成数组的各个变量称为数组的元素。数组是在程序设计中,为了处理方便把具有相同类型的若干元素按有序的形式组织起来的一种形式。按数组元素的类型不同,数组又可分为数值数组、字符数组等各种类别。数组在各个编程语言里处理方式不同,本文仅列出数组在Spark SQL里的函数以及应用案例。

特点:

1.数组是相同数据类型的元素的集合。

2.数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起。

3.数组元素用整个数组的名字和它自己在数组中的顺序位置(索引)来查询。

4.数组在数据库里展示为整体用方括号括起来的类字符串,每个元素用逗号隔开。例如 [1, 2, 3]。

主要函数:

1. 数组生成与转换

00161653461b29135f4916bb7e4d764

常见场景:

A. 数据集多行数据合并成一行,一行拆分为多行。主要使用 concat_ws(collect_set( )),  explode(split( )) 等函数组合使用。具体使用案例请参考: 如何拆分一列字段的不同值放到每一行中 ; 如何按照某列把不同行合并为同一行

B. 因为数据缺失(例如没有销售记录)导致同环比数据对不上,需要补齐数据,或者其他需要笛卡尔积的场景。例如,使用组合函数 explode(sequence([起始日期],[结束日期],interval 1 month)) 来补齐日历。具体使用案例请参考:ETL补齐数据方法

C. 去重计数。count(distinct( )) 函数不支持窗口函数用法,此时可以用 size(collect_set([字段])over(partition by [分组列名])) 来进行去重计数。具体使用案例请参考:如何在去重计数函数中实现开窗

2. 数组基础操作

0016165346b12650207f01438604f72

3. 数组查询

00161653477cfe18d4312e9427c1b42

常用场景:

D. 用户属性为多值,设置数据集行列权限。

       多值的用户属性在数据库里格式是用分隔符连接的字符串,应用时需要拆分开变成数组来处理。例如常用的行权限公式 array_contains(split([CURRENT_USER.城市],','),[城市])  就是用函数 split() 把用户属性值用逗号拆分为数组,然后 array_contains() 用来判断数组里是否包括数据集的字段[城市]里的值。用这种方式“鞍山”会精确匹配到“鞍山”,而不会误匹配到“马鞍山”。相关案例请参考: 针对“一人多店”的数据行权限的配置方案行权限使用案例分享

E. 多个关键词,互相为“或”的关系,模糊匹配长字符串。例如,筛选出标题里包含“原味”或者“香辣”等口味关键词的商品,可以使用 exists(split([口味],','), x -> instr([商品标题],x)>0)。相关案例请参考: 筛选器模糊匹配实现方法

4. 多数组处理

00161653485a881c34ef3dd635986c5

常用场景

F. 从长字符串里截取内容。

       例如,字符串 'GALAXY 202109R2(3.10.3)', 提取出中间202109R2和括号里的3.10.3,提取方法有很多,其中 element_at(flatten(sentences([Sprint])),3) 就是先使用sentences() 把字符串拆分成嵌套数组,再使用flatten()把嵌套数组合并为单个数组,最后用element_at() 根据元素位置提取到元素内容。具体请参考:Spark SQL文本字符串处理函数及应用

G. 合并多个长字符串,并且移除字符串中重复的内容。例如,要实现以下效果,可以参考以下组合函数。

00161654dd8cca4734bd0843f1d21aa

1. array_join(array_union(split([地区1],','),split([地区2],',')),',')
2. concat_ws(',',array_distinct(split(concat_ws(',',[地区1],[地区2]),',')))

H. 数据集字段格式为单层或者多层嵌套json数组, 需要提取json内容。相关案例:如何使用ETL解析json

注意:在数据量大的情况下,尽量避免多层嵌套函数,建议拆分为多个计算字段来逐步操作。

    您需要登录后才可以回复