【问题标题】:How to transpose rows to columns with large amount of the data in BigQuery/SQL?如何将行转置为 BigQuery/SQL 中具有大量数据的列?
【发布时间】:2016-04-20 06:57:32
【问题描述】:

我在将 BigQuery 中的大量数据表(15 亿行)从行转换为列时遇到问题。我可以弄清楚如何在硬编码时使用少量数据来完成它,但是数量很大。该表的快照如下所示:

+--------------------------+ | CustomerID Feature Value | +--------------------------+ | 1 A123 3 | | 1 F213 7 | | 1 F231 8 | | 1 B789 9.1 | | 2 A123 4 | | 2 U123 4 | | 2 B789 12 | | .. .. .. | | .. .. .. | | 400000 A123 8 | | 400000 U123 7 | | 400000 R231 6 | +--------------------------+

所以基本上有大约 400,000 个不同的 customerID 和 3000 个特征,并不是每个 customerID 都具有相同的特征,所以有些 customerID 可能有 2000 个特征,而有些有 3000 个。我想得到的最终结果表是每一行都有一个不同的客户 ID,并具有 3000 列显示所有功能。像这样:

CustomerID Feature1 Feature2 ... Feature3000

所以有些单元格可能有缺失值。

有人知道如何在 BigQuery 或 SQL 中执行此操作吗?

提前致谢。

【问题讨论】:

    标签: mysql sql sql-server google-bigquery transpose


    【解决方案1】:
    STEP #1
    

    在下面的查询中,将yourTable 替换为您的表的真实名称并执行/运行它

    SELECT 'SELECT CustomerID, ' + 
       GROUP_CONCAT_UNQUOTED(
          'MAX(IF(Feature = "' + STRING(Feature) + '", Value, NULL))'
       ) 
       + ' FROM yourTable GROUP BY CustomerID'
    FROM (SELECT Feature FROM yourTable GROUP BY Feature) 
    

    因此,您将获得一些字符串以供下一步使用!

    STEP #2
    

    获取从第 1 步获得的字符串,然后将其作为查询执行
    输出是您询问的 Pivot

    【讨论】:

    • 非常感谢!我已经尝试过,但是,当我从第 2 步运行查询时,我收到一条错误消息,提示“查询执行期间资源超出”。我想这可能是由于 GROUP BY 需要大量内存。有解决办法吗?
    • 我建议从限制/减少功能数量开始。您可以在子查询的第 1 步中对此进行控制
    • 如果 GROUP BY 给您带来麻烦,请尝试 GROUP EACH BY
    • @Jade - 请参阅stackoverflow.com/questions/34845697/… 以获取更多解决“查询执行期间超出资源”的建议。错误
    【解决方案2】:

    嗨@Jade 我之前发布了very similar question。并从@MikhailBerlyant 得到了非常有帮助(和类似)的答案。值得一提的是,在我的案例中,我有大约 4000 个功能要愚蠢化,并且还遇到了“查询执行期间超出资源”错误。

    我认为这种类型的大规模数据转换(而不是查询)最好留给其他更适合这项任务的工具(例如 Spark)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多