假设您的日志(log)中的术语之间没有一致的分隔符(甚至没有空格),我们仍然可以通过使用BigQuery中的REGEXP_EXTRACT_ALL()函数和UNNEST运算符来获得您想要的结果.
步骤1.使用regex_replace()移动日志(log)中的所有空格
步骤2.使用REGEXP_EXTRACT_ALL()将每个(Term(Quantity))标记提取到一个数组中.
步骤3.将数组转换为每行一个(项(数量))令牌
步骤4.使用regex_extract()分别获取期限和数量.请注意,我们需要使用negative lookaround regex(?=和?<;=)来获取我们需要的有关期限和数量的准确数据.
步骤5.按项分组,并在数量上求和(),以获得结果.
请参阅以下代码作为示例:
WITH log_extracted AS (
SELECT
REGEXP_EXTRACT_ALL(
REGEXP_REPLACE(
'TestObserver(2) TestFragment(1) TestView(1) TestNotifications(2) TestActivity(1)',
'_',
''
),
'\w+\(\d+\)'
) AS log_tokens
)
SELECT
REGEXP_EXTRACT(log_token, '(\w+)(?=\(\d+\))') AS term,
SUM(CAST(REGEXP_EXTRACT(log_token, '(?<=\w\()\d+') AS INT64)) AS quantity
FROM log_extracted
CROSS JOIN UNNEST(log_tokens) AS log_token
GROUP BY
1
输出示例:
term |
quantity |
TestFragment |
1 |
TestView |
1 |
TestObserver |
2 |
TestNotifications |
2 |
TestActivity |
1 |