Snowflake cloud data platform 如何计算Snowflake数据库变量字段中顶级json键的数量?
我在这里找2号。。。数组大小似乎适用于变量列表,但在这个json上做得不太好。有没有一个聪明的方法可以做到这一点?我不知道/可能不相信这个结构只会深入到这么深,我希望在查询中使用它作为另一个字段,从json中提取一堆其他值;因此,理想的解决方案也允许这样做Snowflake cloud data platform 如何计算Snowflake数据库变量字段中顶级json键的数量?,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,我在这里找2号。。。数组大小似乎适用于变量列表,但在这个json上做得不太好。有没有一个聪明的方法可以做到这一点?我不知道/可能不相信这个结构只会深入到这么深,我希望在查询中使用它作为另一个字段,从json中提取一堆其他值;因此,理想的解决方案也允许这样做 select dict, array_size(dict) from (select parse_json('{ "partition": [ "partition_col" ], "sample_weight": [
select dict, array_size(dict)
from (select parse_json('{
"partition": [
"partition_col"
],
"sample_weight": [
"sample_weight"
]
}') as dict)
使用展平:
with dict as (
select parse_json('{
"partition": [
"partition_col"
],
"sample_weight": [
"sample_weight"
]
}') val
)
select val, count(*)
from dict,
lateral flatten(input => val)
group by val
;
使用展平:
with dict as (
select parse_json('{
"partition": [
"partition_col"
],
"sample_weight": [
"sample_weight"
]
}') val
)
select val, count(*)
from dict,
lateral flatten(input => val)
group by val
;
在这种情况下,您可以创建一个小的Javascript UDF:
create or replace function count_keys(MYVAR variant)
returns float
language javascript
as '
return (Object.entries(MYVAR)).length
'
;
称之为:
select count_keys(parse_json(
'{
"partition": [
"partition_col"
],
"sample_weight": [
"sample_weight"
]
}')
)
;
在这种情况下,您可以创建一个小的Javascript UDF:
create or replace function count_keys(MYVAR variant)
returns float
language javascript
as '
return (Object.entries(MYVAR)).length
'
;
称之为:
select count_keys(parse_json(
'{
"partition": [
"partition_col"
],
"sample_weight": [
"sample_weight"
]
}')
)
;
我认为这将是一个解决办法;但是我不想做像countdistinct id这样的事情,然后根据这条记录上的其他30列进行分组,所以我希望有一种更优雅的计数函数可以避免扁平化。在这种情况下,您可以编写一个Javascript UDF,返回JSON对象中Object.entries的计数。。。这应该只适用于顶级对象属性。@doyouevendata如果这解决了问题,您能标记解决方案吗?我认为这将是一个解决方案;但是我不想做像countdistinct id这样的事情,然后根据这条记录上的其他30列进行分组,所以我希望有一种更优雅的计数函数可以避免扁平化。在这种情况下,您可以编写一个Javascript UDF,返回JSON对象中Object.entries的计数。。。这应该只适用于顶级对象属性。@doyouevendata如果解决了这个问题,您可以标记解决方案吗?在SQL代码中,UDF函数看起来比FLATTEN好得多,而且我相信它的执行速度也要快得多。有趣的是,在对400K行的测试中,JSON每行包含1000个元素,Javascript花了17秒,而Flatten花了3秒在中型仓库上。看来你是对的,我在X-Small仓库上花了5分钟,而在X-Small仓库上花了17秒。我看到了相反的情况,所以这可能取决于你的情况。但我从来没有想到会有这么大的区别。在SQL代码中,UDF函数看起来比FLATTEN好得多,我相信它的执行速度也要快得多。有趣的是,在一个测试中,有40万行JSON,每行包含1000个元素,Javascript花了17秒,而FLATTEN花了3秒。看起来你是对的,我在一个X-Small仓库工作了5分钟17秒。我看到了相反的情况,所以这可能取决于你的情况。但我从来没有想到会有这么大的不同。