【问题标题】:BigQuery use conditions to create a table from other tables (manage big number of columns)BigQuery 使用条件从其他表创建表(管理大量列)
【发布时间】:2020-07-26 20:24:42
【问题描述】:

我面临一个与我的项目相关的问题。这是我想做的总结:

我有一个很大的每日文件(100 Go),其中包含以下摘录(无标题):

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)。

我想处理这个文件以获得以下结果(结果文件包含一个标题):

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包含在segment中,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 作为参数传递的巨大查询。

有什么可以使用的解决方法吗?

感谢大家的帮助。

问候

【问题讨论】:

    标签: google-bigquery google-cloud-storage bq


    【解决方案1】:

    以下是 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  
    

    如您所见,您无需担心段的数量和命名 - 由上述查询处理

    【讨论】:

    • 你好,米哈伊尔,这正是我想要的。谢谢!但是,当将此脚本与bq cli 一起使用时,我遇到了这个错误(我想将结果保存到一个新表中):BigQuery error in query operation: Error processing job 'project:bqjob_r323e9fd198fe602c_0000017390d81787_1': configuration.query.destinationTable cannot be set for scripts 我认为我需要在脚本中管理它。有什么办法吗?再次感谢您
    • INSERT statement - 如果仍然有问题 - 发布新问题,我们很乐意为您提供进一步的帮助
    猜你喜欢
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 2020-09-25
    • 2021-01-04
    • 2016-10-02
    相关资源
    最近更新 更多