BigQuery 使用条件从其他 table 创建一个 table(管理大量列)
BigQuery use conditions to create a table from other tables (manage big number of columns)
我遇到了一个与我的项目相关的问题。这是我想做的事情的总结:
我有一个很大的日常文件 (100 Go),其中包含以下摘录(没有 header):
ID_A|segment_1
ID_A|segment_2
ID_B|segment_2
ID_B|segment_3
ID_B|segment_4
ID_B|segment_5
ID_C|segment_1
ID_D|segment_2
ID_D|segment_4
每个 ID(从 A 到 D)都可以链接到一个或多个段(从 1 到 5)。
我想处理此文件以获得以下结果(结果文件包含 header):
ID|segment_1|segment_2|segment_3|segment_4|segment_5
ID_A|1|1|0|0|0
ID_B|0|1|1|1|1
ID_C|1|0|0|0|0
ID_D|0|1|0|1|0
1表示该ID包含在段中,0表示不包含。
我正在使用以下查询来获取结果:
select id,
countif(segment = 'segment_1') as segment_1,
countif(segment = 'segment_2') as segment_2,
countif(segment = 'segment_3') as segment_3,
countif(segment = 'segment_4') as segment_4,
countif(segment = 'segment_5') as segment_5
from staging s cross join
unnest(split(segments, ',')) as segment
group by id;
此解决方案对我有效,直到段数变得更高(900 多个段而不是我的第一个示例中的 5 个)。这正在创建一个无法通过 bq
cli.
作为参数传递的巨大查询
有没有我可以使用的解决方法?
感谢大家的帮助。
此致
以下适用于 BigQuery 标准 SQL
EXECUTE IMMEDIATE '''
SELECT id, ''' || (
SELECT STRING_AGG("COUNTIF(segment = '" || segment || "') AS " || segment ORDER BY segment)
FROM (SELECT DISTINCT segment FROM staging)
) || '''
FROM staging
GROUP BY 1
ORDER BY 1
'''
如果应用于您问题中的示例数据 - 输出为
Row id segment_1 segment_2 segment_3 segment_4 segment_5
1 ID_A 1 1 0 0 0
2 ID_B 0 1 1 1 1
3 ID_C 1 0 0 0 0
4 ID_D 0 1 0 1 0
如您所见,您无需担心段的数量和命名 - 上面的查询会处理这些问题
我遇到了一个与我的项目相关的问题。这是我想做的事情的总结:
我有一个很大的日常文件 (100 Go),其中包含以下摘录(没有 header):
ID_A|segment_1
ID_A|segment_2
ID_B|segment_2
ID_B|segment_3
ID_B|segment_4
ID_B|segment_5
ID_C|segment_1
ID_D|segment_2
ID_D|segment_4
每个 ID(从 A 到 D)都可以链接到一个或多个段(从 1 到 5)。
我想处理此文件以获得以下结果(结果文件包含 header):
ID|segment_1|segment_2|segment_3|segment_4|segment_5
ID_A|1|1|0|0|0
ID_B|0|1|1|1|1
ID_C|1|0|0|0|0
ID_D|0|1|0|1|0
1表示该ID包含在段中,0表示不包含。
我正在使用以下查询来获取结果:
select id,
countif(segment = 'segment_1') as segment_1,
countif(segment = 'segment_2') as segment_2,
countif(segment = 'segment_3') as segment_3,
countif(segment = 'segment_4') as segment_4,
countif(segment = 'segment_5') as segment_5
from staging s cross join
unnest(split(segments, ',')) as segment
group by id;
此解决方案对我有效,直到段数变得更高(900 多个段而不是我的第一个示例中的 5 个)。这正在创建一个无法通过 bq
cli.
有没有我可以使用的解决方法?
感谢大家的帮助。
此致
以下适用于 BigQuery 标准 SQL
EXECUTE IMMEDIATE '''
SELECT id, ''' || (
SELECT STRING_AGG("COUNTIF(segment = '" || segment || "') AS " || segment ORDER BY segment)
FROM (SELECT DISTINCT segment FROM staging)
) || '''
FROM staging
GROUP BY 1
ORDER BY 1
'''
如果应用于您问题中的示例数据 - 输出为
Row id segment_1 segment_2 segment_3 segment_4 segment_5
1 ID_A 1 1 0 0 0
2 ID_B 0 1 1 1 1
3 ID_C 1 0 0 0 0
4 ID_D 0 1 0 1 0
如您所见,您无需担心段的数量和命名 - 上面的查询会处理这些问题