3

我使用包含 url 编码列的压缩日志文件。(空格字符编码为“%20”等)。

我的计划是将这些文件直接从 Google Cloud Storage 导入 BigQuery。

我没有在加载配置中找到任何选项来在导入期间自动解码值。

我想您不会建议在我的所有查询中使用一系列REGEXP_REPLACE

有什么想法可以避免解析所有日志并在将所有这些字符导入 BigQuery 之前对其进行转义(如果其中一个是分隔符,这将是危险的)?

4

2 回答 2

2

如果是旧版 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
于 2017-07-03T12:15:03.453 回答
1

很可能你已经得到了类似下面的东西: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
    });
  }"
)

https://cloud.google.com/bigquery/user-defined-functions

于 2015-12-18T21:09:42.140 回答