能否在BigQuery外部表中添加row number列?无排序列时如何实现?
针对GCS外部CSV表生成确定性行号的解决方法
直接用BigQuery外部表自带的伪列就能搞定,不用修改源文件:
用
_OFFSET和_FILE_NAME做排序依据
BigQuery给外部表提供了两个隐藏伪列:_FILE_NAME:对应GCS桶里的具体CSV文件路径_OFFSET:每条记录在源CSV文件里的起始字节偏移量
只要你的CSV是规范格式(字段不含换行符),
_OFFSET会按行的顺序递增,用它来排序,ROW_NUMBER()生成的行号就和源文件里的行顺序完全一致,而且每次查询结果都是确定的,不会乱序。示例SQL:
SELECT *, -- 多文件场景按单个文件独立生成行号;单文件可去掉PARTITION BY ROW_NUMBER() OVER (PARTITION BY _FILE_NAME ORDER BY _OFFSET) AS source_row_number FROM `你的项目ID.数据集ID.目标外部表名`特殊场景说明
如果你的CSV存在字段包含换行符的情况(这类场景较少见),_OFFSET可能无法准确对应行号,建议先清洗掉字段内的换行符再使用上述方法;或者直接将CSV导入BigQuery内部表(导入过程会自动处理跨行字段),之后再用同样的伪列逻辑生成行号。
内容的提问来源于stack exchange,提问作者Abi
相关产品推荐
相关产品推荐

