获取雪花中 varchar 字段的统计度量

Get statistical measures of a varchar field in snowflake

我在雪花 table 中有一个名为 MER_DATA 的字段,其值如下所示:

[43,44.25,44.5,42.75,44,44.25,42.75,43,42.5,42.5,36.75,42.25,42.75,43.25,43.25,43.25,42.75,43.5,42,43,43.75,43.75,43.25,41.75,43.25,42.5,43.25,42.75,43.25,43.5,43.25,43.25,43.75,...]

每行大约有 4k(这因行而异)数字,字段的数据类型为 varchar(30000)。数据约为 700k 行

现在我想使用上面列表中的数字计算每行的标准偏差。

我已经尝试使用以下查询在 MySQL 中执行此操作:

select mac, `timestamp`, std(res), min(res), max(res) 
from 
    (select mac, `timestamp`, r.res from table cmr ,
    json_table(mer_data, '$[*]' columns (res float path '$'))r)T 
group by mac, `timestamp`;

这给了我正确的结果,但是 70 万行需要很多时间。

我想在雪花中做同样的事情。有没有最佳的方法来做到这一点?

此外,查询需要在 10 分钟内在雪花中 运行。 mysql 查询最多可能需要 1 小时。

没有 table 定义和示例源数据,很难为您的问题生成完整的解决方案,但这里有一个示例,说明如何使用 STRTOK_SPLIT_TO_TABLE table首先将您的 varchar 数字拆分为行的函数,因此我们可以 re-aggregate 值来获取每行的标准偏差。

首先以正确的比例生成一些测试数据:

Create or Replace Table cmr (mer_data varchar) as
With gen as (
select 
   uniform(1,700000, random()) row_num,
   normal(50, 1, random(0))::decimal(4,2) num
from table(generator(rowcount => 2800000000)) v 
)
Select listagg(num, ',') listNums from gen group by row_num
;

检查我们有 70 万行和每行不同的数字。

Select 
  count(*) row_count, 
  min(REGEXP_COUNT( mer_data , '[,]' ))+1 min_num_count, 
  max(REGEXP_COUNT( mer_data , '[,]' ))+1 max_num_count 
from cmr limit 10;

将 varchar 数字列表拆分为具有 STRTOK_SPLIT_TO_TABLE 的行,并按生成的 SEQ 列分组以计算 VALUE 的标准偏差。

Select 
  seq row_num, 
  stddev(value) stdListNums, 
  min(value) minNum, max(value) maxNum, 
  count(value) countListNums
from cmr, table(STRTOK_SPLIT_TO_TABLE(mer_data ,',')) 
Group By 1
;

对于我的数据,在 XSMALL Virtual Warehouse 上查询只需 3 分钟多一点,并且 在大型虚拟仓库上需要 30 多秒。

您可以阅读 STRTOK_SPLIT_TO_TABLE 函数 here