我想尝试不同的态度 - 拆分原来的表......
问题是我不希望拆分在某些分组中间“中断”。
以下是如何识别批次,以使相同 visitid 的行位于同一批次中
对于每个批次的最大和最小访问ID,您可以使用它们来仅提取最小和最大值之间的那些访问ID的行,从而控制要处理的数据的大小
1 – 按行数进行批处理
将下面的 1000000 替换为您希望批量大小的行数
#legacySQL
SELECT
batch,
SUM(size) AS size,
COUNT(visitId) AS visitids_count,
MIN(visitId) AS visitId_min,
MAX(visitId) AS visitId_max
FROM (
SELECT
visitId,
size,
INTEGER(CEIL(total/1000000)) AS batch
FROM (
SELECT
visitId,
size,
SUM(size) OVER(ORDER BY visitId ) AS total
FROM (
SELECT visitId, COUNT(1) AS size
FROM [yourproject:yourdataset.yourtable]
GROUP BY visitId
)
)
)
GROUP BY batch
2 – 按批次的字节大小进行批处理
将下面的 1000000000 替换为您希望批量大小以字节为单位的任何值
并将下面的 123 替换为估计的一排平均大小(以字节为单位)
#legacySQL
SELECT
batch,
SUM(size) AS size,
COUNT(visitId) AS visitids_count,
MIN(visitId) AS visitId_min,
MAX(visitId) AS visitId_max
FROM (
SELECT
visitId,
size,
INTEGER(CEIL(total/1000000000)) AS batch
FROM (
SELECT
visitId,
size,
SUM(size) OVER(ORDER BY visitId ) AS total
FROM (
SELECT visitId, SUM(123) AS size
FROM [yourproject:yourdataset.yourtable]
GROUP BY visitId
)
)
)
GROUP BY batch
以上内容可帮助您为使用批量最小值和最大值正确拆分原始表做好准备
希望这可以帮助您进一步进行
注意:以上假设 visitid 的行分布正常且表中的行数相对较大(如您的示例中),因此批次的大小将合理均匀
注意 2:我意识到我在 Legacy SQL 中快速编写了它,所以下面是标准 SQL 的版本,以防你想migrate 或已经在使用它
#standardSQL
SELECT
batch,
SUM(size) AS size,
COUNT(visitId) AS visitids_count,
MIN(visitId) AS visitId_min,
MAX(visitId) AS visitId_max
FROM (
SELECT
visitId,
size,
CAST(CEIL(total/1000000) as INT64) AS batch
FROM (
SELECT
visitId,
size,
SUM(size) OVER(ORDER BY visitId ) AS total
FROM (
SELECT visitId, COUNT(1) AS size
FROM `yourproject.yourdataset.yourtable`
GROUP BY visitId
)
)
)
GROUP BY batch