获取雪花中 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。
我在雪花 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。