如何将BigQuery/SQL中数据量大的行转列?
How to transpose rows to columns with large amount of the data in BigQuery/SQL?
我在将 BigQuery(15 亿行)中的大量数据 table 从行转为列时遇到问题。我可以弄清楚如何在硬编码时使用少量数据来做到这一点,但是有这么大的数据量。 table 的快照如下所示:
+--------------------------+
| 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 个。最终结果 table 我想get 是每一行呈现一个不同的 customerID,并有 3000 列呈现所有功能。像这样:
CustomerID Feature1 Feature2 ... Feature3000
所以有些单元格可能有缺失值。
有人知道如何在 BigQuery 或 SQL 中执行此操作吗?
提前致谢。
STEP #1
在下面的查询中,将 yourTable
替换为您的 table 和 execute/run 的真实姓名
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
嗨@Jade 我之前发布了一个very similar question。并从@MikhailBerlyant 那里得到了一个非常有帮助(和类似)的答案。对于它的价值,在我的案例中我有大约 4000 个特征需要虚拟化,并且 运行 变成 "Resources exceeded during query execution" 错误。
我认为这种large-scale数据t运行sformation(而不是query)最好留给其他更适合这个任务的工具(比如Spark)。
我在将 BigQuery(15 亿行)中的大量数据 table 从行转为列时遇到问题。我可以弄清楚如何在硬编码时使用少量数据来做到这一点,但是有这么大的数据量。 table 的快照如下所示:
+--------------------------+
| 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 个。最终结果 table 我想get 是每一行呈现一个不同的 customerID,并有 3000 列呈现所有功能。像这样:
CustomerID Feature1 Feature2 ... Feature3000
所以有些单元格可能有缺失值。
有人知道如何在 BigQuery 或 SQL 中执行此操作吗?
提前致谢。
STEP #1
在下面的查询中,将 yourTable
替换为您的 table 和 execute/run 的真实姓名
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
嗨@Jade 我之前发布了一个very similar question。并从@MikhailBerlyant 那里得到了一个非常有帮助(和类似)的答案。对于它的价值,在我的案例中我有大约 4000 个特征需要虚拟化,并且 运行 变成 "Resources exceeded during query execution" 错误。
我认为这种large-scale数据t运行sformation(而不是query)最好留给其他更适合这个任务的工具(比如Spark)。