我使用包含 url 编码列的压缩日志文件。(空格字符编码为“%20”等)。
我的计划是将这些文件直接从 Google Cloud Storage 导入 BigQuery。
我没有在加载配置中找到任何选项来在导入期间自动解码值。
我想您不会建议在我的所有查询中使用一系列REGEXP_REPLACE。
有什么想法可以避免解析所有日志并在将所有这些字符导入 BigQuery 之前对其进行转义(如果其中一个是分隔符,这将是危险的)?
我使用包含 url 编码列的压缩日志文件。(空格字符编码为“%20”等)。
我的计划是将这些文件直接从 Google Cloud Storage 导入 BigQuery。
我没有在加载配置中找到任何选项来在导入期间自动解码值。
我想您不会建议在我的所有查询中使用一系列REGEXP_REPLACE。
有什么想法可以避免解析所有日志并在将所有这些字符导入 BigQuery 之前对其进行转义(如果其中一个是分隔符,这将是危险的)?
如果是旧版 SQL,则接受的答案。
对于标准 SQL:
#standardSQL
CREATE TEMPORARY FUNCTION DECODE_URI_COMPONENT(path STRING)
RETURNS STRING
LANGUAGE js AS """
if (path == null) return null;
try {
return decodeURIComponent(path);
} catch (e) {
return path;
}
""";
WITH source AS (SELECT "/work.json?myfield=R%C3%A9gions%2CSport" AS path)
SELECT DECODE_URI_COMPONENT(REGEXP_EXTRACT(path, r"[?&]myfield=([^&]+)")) AS myfield FROM source
这将返回:
myfield
---------------
Régions,Sport
很可能你已经得到了类似下面的东西:o)
SELECT url FROM
js(
(SELECT url FROM
(SELECT 'http://example.com/query?q=my%20query%20string' AS url),
(SELECT 'http://example.com/query?q=your%20query%20string' AS url),
(SELECT 'http://example.com/query?q=his%20query%20string' AS url)
),
// Input columns.
url,
// Output schema.
"[
{name: 'url', type:'string'}]",
// The function.
"function(r, emit) {
var url = decodeURI(r.url);
emit({
url: url
});
}"
)