Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Snowflake cloud data platform 如何计算Snowflake数据库变量字段中顶级json键的数量?_Snowflake Cloud Data Platform - Fatal编程技术网

Snowflake cloud data platform 如何计算Snowflake数据库变量字段中顶级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": [

我在这里找2号。。。数组大小似乎适用于变量列表,但在这个json上做得不太好。有没有一个聪明的方法可以做到这一点?我不知道/可能不相信这个结构只会深入到这么深,我希望在查询中使用它作为另一个字段,从json中提取一堆其他值;因此,理想的解决方案也允许这样做

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秒。我看到了相反的情况,所以这可能取决于你的情况。但我从来没有想到会有这么大的不同。