BigQuery是否有UDF可批量去除表中所有字符串字段的空格?
BigQuery批量去除所有STRING字段首尾空格的最优方案
方案1:动态SQL(推荐,无需UDF,性能最优)
不需要手动枚举字段,通过查询INFORMATION_SCHEMA自动识别表中所有STRING类型字段,生成批量处理逻辑,完美适配数百字段的大表场景。
操作步骤
- 替换代码中的
你的项目ID.你的数据集名.你的表名为实际表路径 - 执行以下SQL即可自动生成并执行清洗逻辑
DECLARE table_path STRING DEFAULT '你的项目ID.你的数据集名.你的表名'; DECLARE trim_sql STRING; -- 自动生成TRIM逻辑:STRING字段执行TRIM,其他类型字段原样保留 SET trim_sql = ( SELECT CONCAT( 'SELECT ', STRING_AGG( IF(data_type = 'STRING', CONCAT('TRIM(`', column_name, '`) AS `', column_name, '`'), '`' || column_name || '`'), ', ' ), ' FROM `', table_path, '`' ) FROM `你的项目ID.你的数据集名.INFORMATION_SCHEMA.COLUMNS` WHERE table_catalog = SPLIT(table_path, '.')[OFFSET(0)] AND table_schema = SPLIT(table_path, '.')[OFFSET(1)] AND table_name = SPLIT(table_path, '.')[OFFSET(2)] ); -- 执行生成的清洗SQL EXECUTE IMMEDIATE trim_sql;
如果需要将清洗后的数据覆盖原表,只需要把生成的SQL前缀修改为CREATE OR REPLACE TABLE || table_path ||AS SELECT即可。
方案2:封装为UDF复用
如果需要频繁对不同表执行该操作,可以创建通用JS UDF批量处理行内所有字符串字段:
-- 创建通用TRIM所有字符串字段的UDF CREATE TEMP FUNCTION trim_all_string_fields(input ANY TYPE) RETURNS ANY TYPE LANGUAGE js AS """ for (let key in input) { if (typeof input[key] === 'string') { input[key] = input[key].trim(); } } return input; """; -- 调用UDF处理表数据 SELECT trim_all_string_fields(t).* FROM `你的项目ID.你的数据集名.你的表名` t;
示例表测试效果
你提供的示例表中number、Sex、level三个STRING字段的首尾空格会被完全清除,处理后结果如下:
| number | Sex | Age | level |
|---|---|---|---|
| 1 | Male | 12 | A |
| 2 | Male | 11 | A- |
| 3 | Female | 9 | A |
| 4 | Female | 13 | A |
| 5 | Male | 10 | B |
注意:如果需要去除字段值内的所有空格而非仅首尾,将
TRIM替换为REGEXP_REPLACE(字段名, '\\s+', '')即可。
内容的提问来源于stack exchange,提问作者SimonGan
相关产品推荐
相关产品推荐

