SQL UDF 中传递的参数数量限制是多少?
What is the limit on number of paramaters passed in a SQL UDF?
我正在尝试使用变体 table 将我提取的信息转换为 Snowflake,并使用我需要的计算数据创建一个新的 table。
例如我正在提取这些信息
数据列:
并且我想计算出这样的 table 作为输出:
团队 |Min_speed|Max_speed|Median_speed|Mean_speed|Average_speed|current_date
我 read here 您需要将 javascript 和 SQL UDF 分开,但找不到对我可以传递给 UDF 的参数数量的任何限制。
使用 python,我可以转换此信息,但我希望 table 超时插入它 - 我正在 s3 阶段探索 Lamdas,但现在我需要专注于udf 调用将新数据加载到 table 中。
CREATE OR REPLACE PROCEDURE SPEED_BY_GAME_DAY (team_id, sprint_speed)
LANGUAGE SQL
AS '
INSERT INTO new_table VALUES(SELECT team_id, MIN(sprint_speed) as Min_speed, MAX(sprint_speed) as AVG(sprint_speed_) as AVG_speed, CURRENT_DATE()
FROM
tablename
WHERE
CURRENT_DATE() = TODAY()
GROUP BY team_id; )
';
这是正确的方向吗?
你的问题看起来像是一个理论练习。
某处显然存在实际最大值,您如何保持对数百个参数的监督?
如果你需要大量的参数,你可以将它们构造成一个 VARIANT
类型的参数,可以用 OBJECT_CONSTRUCT()
和 ARRAY_CONSTRUCT()
构造。
如果数据以 Variant 类型可用,那么我们可以直接将数据展平以满足 objective 而无需通过 UDF 代码。
为了测试,我创建了一个 table with variant 列并添加了 team_id 和 sprint_speed 的记录。然后将这些记录展平以获得它们的值,这些值用于将记录插入 new_table.
create or replace table team_table1 (col1 variant)
create or replace table team_table2
(team_id number,
min_sprint number (3,1),
max_sprint number (3,1),
avg_sprint number (3,1),
current_date date)
insert into team_table1
select parse_json(column1) as col1
from values
( '
{
"team statistics":
{
"stats": [
{
"team_Id": "109",
"sprint_Speed": "30.8"
}
]
}
}') as valinsert
insert into team_table1
select parse_json(column1) as col1
from values
( '
{
"team statistics":
{
"stats": [
{
"team_Id": "120",
"sprint_Speed": "30.4"
}
]
}
}') as valinsert
insert into team_table1
select parse_json(column1) as col1
from values
( '
{
"team statistics":
{
"stats": [
{
"team_Id": "142",
"sprint_Speed": "30.3"
}
]
}
}') as valinsert
insert into team_table2
with cte as (
SELECT *
FROM (
SELECT
SEQ,
VALUE['team_Id']::number AS team_Id,
VALUE['sprint_Speed']::number(3,1) AS sprint_speed
from team_table1,
LATERAL FLATTEN(INPUT => COL1['team statistics']['stats'])
ORDER BY SEQ, INDEX
)
)
select
team_Id,
MIN(sprint_speed),
MAX(sprint_speed),
AVG(sprint_speed),
CURRENT_DATE
FROM cte
GROUP BY team_id;
select * from team_Table2;
我正在尝试使用变体 table 将我提取的信息转换为 Snowflake,并使用我需要的计算数据创建一个新的 table。
例如我正在提取这些信息
数据列:
并且我想计算出这样的 table 作为输出:
团队 |Min_speed|Max_speed|Median_speed|Mean_speed|Average_speed|current_date
我 read here 您需要将 javascript 和 SQL UDF 分开,但找不到对我可以传递给 UDF 的参数数量的任何限制。
使用 python,我可以转换此信息,但我希望 table 超时插入它 - 我正在 s3 阶段探索 Lamdas,但现在我需要专注于udf 调用将新数据加载到 table 中。
CREATE OR REPLACE PROCEDURE SPEED_BY_GAME_DAY (team_id, sprint_speed)
LANGUAGE SQL
AS '
INSERT INTO new_table VALUES(SELECT team_id, MIN(sprint_speed) as Min_speed, MAX(sprint_speed) as AVG(sprint_speed_) as AVG_speed, CURRENT_DATE()
FROM
tablename
WHERE
CURRENT_DATE() = TODAY()
GROUP BY team_id; )
';
这是正确的方向吗?
你的问题看起来像是一个理论练习。
某处显然存在实际最大值,您如何保持对数百个参数的监督?
如果你需要大量的参数,你可以将它们构造成一个 VARIANT
类型的参数,可以用 OBJECT_CONSTRUCT()
和 ARRAY_CONSTRUCT()
构造。
如果数据以 Variant 类型可用,那么我们可以直接将数据展平以满足 objective 而无需通过 UDF 代码。
为了测试,我创建了一个 table with variant 列并添加了 team_id 和 sprint_speed 的记录。然后将这些记录展平以获得它们的值,这些值用于将记录插入 new_table.
create or replace table team_table1 (col1 variant)
create or replace table team_table2
(team_id number,
min_sprint number (3,1),
max_sprint number (3,1),
avg_sprint number (3,1),
current_date date)
insert into team_table1
select parse_json(column1) as col1
from values
( '
{
"team statistics":
{
"stats": [
{
"team_Id": "109",
"sprint_Speed": "30.8"
}
]
}
}') as valinsert
insert into team_table1
select parse_json(column1) as col1
from values
( '
{
"team statistics":
{
"stats": [
{
"team_Id": "120",
"sprint_Speed": "30.4"
}
]
}
}') as valinsert
insert into team_table1
select parse_json(column1) as col1
from values
( '
{
"team statistics":
{
"stats": [
{
"team_Id": "142",
"sprint_Speed": "30.3"
}
]
}
}') as valinsert
insert into team_table2
with cte as (
SELECT *
FROM (
SELECT
SEQ,
VALUE['team_Id']::number AS team_Id,
VALUE['sprint_Speed']::number(3,1) AS sprint_speed
from team_table1,
LATERAL FLATTEN(INPUT => COL1['team statistics']['stats'])
ORDER BY SEQ, INDEX
)
)
select
team_Id,
MIN(sprint_speed),
MAX(sprint_speed),
AVG(sprint_speed),
CURRENT_DATE
FROM cte
GROUP BY team_id;
select * from team_Table2;