努力实现 运行 我在 BigQuery 中的第一个存储过程(pivot table 灵感来自 Felipe Hoffa 在 BigQuery post 中的 Easy pivot())
Struggling to run my first stored procedure in BigQuery (pivot table inspired by Felipe Hoffa's Easy pivot() in BigQuery post)
我一直在关注 Felipe Hoffa 的博客 post“BigQuery 中的 Easy pivot()”(https://towardsdatascience.com/easy-pivot-in-bigquery-one-step-5a1f13c6c710),我已经能够成功调用他的过程并复制他的示例计算.但是,因为我最终感兴趣的数据托管在欧盟,所以我无法逐字调用他的程序,并且尝试创建代码副本 运行 并将其复制到我自己的个人 BigQuery 项目文件夹中,但没有成功结果。
据我所知,所涉及的步骤是。
复制代码到这里https://github.com/fhoffa/code_snippets/blob/5163b921398ee29a8010c164a17af05268ac8639/util/pivot.sql
更新项目 ID 和数据集(例如,将“`fhoffa.x”的每个实例替换为我的 BigQuery 信息“blah.matt .") 并在我自己的 BigQuery 帐户中创建存储过程
运行代码,为新位置调整。
类似于:
CALL `*blah*.matt.pivot`(
'bigquery-public-data.iowa_liquor_sales.sales' # source table
, 'blah.matt.test2' # destination table
, ['date'] # row_ids
, 'store_number' # pivot_col_name
, 'sale_dollars' # pivot_col_value
, 5 # max_columns
, 'SUM' # aggregation
, '' # optional_limit
);
不幸的是,当我这样做时,我遇到了以下错误。
无效的 EXECUTE IMMEDIATE sql 字符串 SELECT STRING_AGG(' SUM(IF('||@pivot_col_name||'="'||x.value||'", '||@pivot_col_value||', null)) e_'||blah.matt.normalize_col_name(x.value)) FROM UNNEST(( SELECT APPROX_TOP_COUNT(store_number, @max_columns) FROM
bigquery-public-data.iowa_liquor_sales.sales)) x
,语法错误:应为“)”但得到标识符“matt” “在 [blah.matt.pivot:5:5]
谁能指点一下?我是 Big Query 的新手,无法判断我在哪里偏离 rails。如果这是一个超级基础的问题,我们深表歉意。
非常感谢您的宝贵时间和帮助!
此致,
马特
您的问题很可能与未正确引用您的 project.dataset 或只是有拼写错误等有关 - 为了安全起见,请按以下操作(只需从下面复制粘贴)
CREATE OR REPLACE FUNCTION
`blah.matt.normalize_col_name`(col_name STRING) AS (
REGEXP_REPLACE(col_name,r'[/+#|]', '_')
);
CREATE OR REPLACE PROCEDURE `blah.matt.pivot`(
table_name STRING
, destination_table STRING
, row_ids ARRAY<STRING>
, pivot_col_name STRING
, pivot_col_value STRING
, max_columns INT64
, aggregation STRING
, optional_limit STRING
)
BEGIN
DECLARE pivotter STRING;
EXECUTE IMMEDIATE (
"SELECT STRING_AGG(' "||aggregation
||"""(IF('||@pivot_col_name||'="'||x.value||'", '||@pivot_col_value||', null)) e_'||`blah.matt.normalize_col_name`(x.value))
FROM UNNEST((
SELECT APPROX_TOP_COUNT("""||pivot_col_name||", @max_columns) FROM `"||table_name||"`)) x"
) INTO pivotter
USING pivot_col_name AS pivot_col_name, pivot_col_value AS pivot_col_value, max_columns AS max_columns;
EXECUTE IMMEDIATE (
'CREATE OR REPLACE TABLE `'||destination_table
||'` AS SELECT '
||(SELECT STRING_AGG(x) FROM UNNEST(row_ids) x)
||', '||pivotter
||' FROM `'||table_name||'` GROUP BY '
|| (SELECT STRING_AGG(''||(i+1)) FROM UNNEST(row_ids) WITH OFFSET i)||' ORDER BY '
|| (SELECT STRING_AGG(''||(i+1)) FROM UNNEST(row_ids) WITH OFFSET i)
||' '||optional_limit
);
END;
因此,在创建上述过程之后 - 下面的调用现在应该可以正常工作了
CALL `blah.matt.pivot`(
'bigquery-public-data.iowa_liquor_sales.sales' # source table
, 'blah.matt.test2' # destination table
, ['date'] # row_ids
, 'store_number' # pivot_col_name
, 'sale_dollars' # pivot_col_value
, 5 # max_columns
, 'SUM' # aggregation
, '' # optional_limit
);
注意:只需将 blah 和 matt 替换为项目和数据集各自的专有名称
P.S。显然,您可以避免所有这些麻烦,只需调用 Felipe 的公开可用过程 - fhoffa.x.pivot
但我同意,在本地拥有这些将允许根据您的潜在特定需求调整这些过程并进一步改进和编码 - 我认为这里仍有很大的空间 :o)
我一直在关注 Felipe Hoffa 的博客 post“BigQuery 中的 Easy pivot()”(https://towardsdatascience.com/easy-pivot-in-bigquery-one-step-5a1f13c6c710),我已经能够成功调用他的过程并复制他的示例计算.但是,因为我最终感兴趣的数据托管在欧盟,所以我无法逐字调用他的程序,并且尝试创建代码副本 运行 并将其复制到我自己的个人 BigQuery 项目文件夹中,但没有成功结果。
据我所知,所涉及的步骤是。
复制代码到这里https://github.com/fhoffa/code_snippets/blob/5163b921398ee29a8010c164a17af05268ac8639/util/pivot.sql
更新项目 ID 和数据集(例如,将“`fhoffa.x”的每个实例替换为我的 BigQuery 信息“blah.matt .") 并在我自己的 BigQuery 帐户中创建存储过程
运行代码,为新位置调整。
类似于:
CALL `*blah*.matt.pivot`(
'bigquery-public-data.iowa_liquor_sales.sales' # source table
, 'blah.matt.test2' # destination table
, ['date'] # row_ids
, 'store_number' # pivot_col_name
, 'sale_dollars' # pivot_col_value
, 5 # max_columns
, 'SUM' # aggregation
, '' # optional_limit
);
不幸的是,当我这样做时,我遇到了以下错误。
无效的 EXECUTE IMMEDIATE sql 字符串 SELECT STRING_AGG(' SUM(IF('||@pivot_col_name||'="'||x.value||'", '||@pivot_col_value||', null)) e_'||blah.matt.normalize_col_name(x.value)) FROM UNNEST(( SELECT APPROX_TOP_COUNT(store_number, @max_columns) FROM
bigquery-public-data.iowa_liquor_sales.sales)) x
,语法错误:应为“)”但得到标识符“matt” “在 [blah.matt.pivot:5:5]
谁能指点一下?我是 Big Query 的新手,无法判断我在哪里偏离 rails。如果这是一个超级基础的问题,我们深表歉意。
非常感谢您的宝贵时间和帮助!
此致, 马特
您的问题很可能与未正确引用您的 project.dataset 或只是有拼写错误等有关 - 为了安全起见,请按以下操作(只需从下面复制粘贴)
CREATE OR REPLACE FUNCTION
`blah.matt.normalize_col_name`(col_name STRING) AS (
REGEXP_REPLACE(col_name,r'[/+#|]', '_')
);
CREATE OR REPLACE PROCEDURE `blah.matt.pivot`(
table_name STRING
, destination_table STRING
, row_ids ARRAY<STRING>
, pivot_col_name STRING
, pivot_col_value STRING
, max_columns INT64
, aggregation STRING
, optional_limit STRING
)
BEGIN
DECLARE pivotter STRING;
EXECUTE IMMEDIATE (
"SELECT STRING_AGG(' "||aggregation
||"""(IF('||@pivot_col_name||'="'||x.value||'", '||@pivot_col_value||', null)) e_'||`blah.matt.normalize_col_name`(x.value))
FROM UNNEST((
SELECT APPROX_TOP_COUNT("""||pivot_col_name||", @max_columns) FROM `"||table_name||"`)) x"
) INTO pivotter
USING pivot_col_name AS pivot_col_name, pivot_col_value AS pivot_col_value, max_columns AS max_columns;
EXECUTE IMMEDIATE (
'CREATE OR REPLACE TABLE `'||destination_table
||'` AS SELECT '
||(SELECT STRING_AGG(x) FROM UNNEST(row_ids) x)
||', '||pivotter
||' FROM `'||table_name||'` GROUP BY '
|| (SELECT STRING_AGG(''||(i+1)) FROM UNNEST(row_ids) WITH OFFSET i)||' ORDER BY '
|| (SELECT STRING_AGG(''||(i+1)) FROM UNNEST(row_ids) WITH OFFSET i)
||' '||optional_limit
);
END;
因此,在创建上述过程之后 - 下面的调用现在应该可以正常工作了
CALL `blah.matt.pivot`(
'bigquery-public-data.iowa_liquor_sales.sales' # source table
, 'blah.matt.test2' # destination table
, ['date'] # row_ids
, 'store_number' # pivot_col_name
, 'sale_dollars' # pivot_col_value
, 5 # max_columns
, 'SUM' # aggregation
, '' # optional_limit
);
注意:只需将 blah 和 matt 替换为项目和数据集各自的专有名称
P.S。显然,您可以避免所有这些麻烦,只需调用 Felipe 的公开可用过程 - fhoffa.x.pivot
但我同意,在本地拥有这些将允许根据您的潜在特定需求调整这些过程并进一步改进和编码 - 我认为这里仍有很大的空间 :o)