在 BigQuery 中循环遍历列并用零替换空值的编程方式?
Programmatic way to loop over columns and replace null values with zeros in BigQuery?
我正在尝试在 BigQuery 中准备大数据 table 以进行回归,其中涉及大量“虚拟”(也称为分类)变量。
此过程的最后一个步骤要求我有效地将 table 中的所有空值实例替换为零。
在 Big Query 中是否有一种简洁的编程方式来执行此操作?例如,在下面的 table 中,理想情况下我希望遍历所有“country_*”字段,并以非硬编码方式替换为零。我有一个暗示,这可能是动态 SQL 的工作,但我在文档中迷路了。任何帮助将不胜感激!
TLDR:这是我面临的数据结构的一个例子。
country
country_1
country_2
country_3
other covariates
1
1
-
-
2
-
1
-
3
-
-
1
这就是我想要的
country
country_1
country_2
country_3
other covariates
1
1
0
0
2
0
1
0
3
0
0
1
简单方法:
select country,
ifnull(country_1, 0) as country_1,
...
FROM TABLE
试试下面
create temp function extract_keys(input string) returns array<string> language js as "return Object.keys(JSON.parse(input));";
create temp function extract_values(input string) returns array<string> language js as "return Object.values(JSON.parse(input));";
select * except(json)
from (
select json, col, val
from your_table t,
unnest([struct(replace(to_json_string(t), ':null', ':0') as json)]),
unnest(extract_keys(json)) col with offset
join unnest(extract_values(json)) val with offset
using(offset)
)
pivot (any_value(val) for col in ('country', 'country_1', 'country_2', 'country_3'))
如果应用于您问题中的示例数据 - 输出为
我正在尝试在 BigQuery 中准备大数据 table 以进行回归,其中涉及大量“虚拟”(也称为分类)变量。
此过程的最后一个步骤要求我有效地将 table 中的所有空值实例替换为零。
在 Big Query 中是否有一种简洁的编程方式来执行此操作?例如,在下面的 table 中,理想情况下我希望遍历所有“country_*”字段,并以非硬编码方式替换为零。我有一个暗示,这可能是动态 SQL 的工作,但我在文档中迷路了。任何帮助将不胜感激!
TLDR:这是我面临的数据结构的一个例子。
country | country_1 | country_2 | country_3 | other covariates |
---|---|---|---|---|
1 | 1 | - | - | |
2 | - | 1 | - | |
3 | - | - | 1 |
这就是我想要的
country | country_1 | country_2 | country_3 | other covariates |
---|---|---|---|---|
1 | 1 | 0 | 0 | |
2 | 0 | 1 | 0 | |
3 | 0 | 0 | 1 |
简单方法:
select country,
ifnull(country_1, 0) as country_1,
...
FROM TABLE
试试下面
create temp function extract_keys(input string) returns array<string> language js as "return Object.keys(JSON.parse(input));";
create temp function extract_values(input string) returns array<string> language js as "return Object.values(JSON.parse(input));";
select * except(json)
from (
select json, col, val
from your_table t,
unnest([struct(replace(to_json_string(t), ':null', ':0') as json)]),
unnest(extract_keys(json)) col with offset
join unnest(extract_values(json)) val with offset
using(offset)
)
pivot (any_value(val) for col in ('country', 'country_1', 'country_2', 'country_3'))
如果应用于您问题中的示例数据 - 输出为