如何从bigquery中的字符串中提取子集

Posted

技术标签:

【中文标题】如何从bigquery中的字符串中提取子集【英文标题】:How extract subsets from string in bigquery 【发布时间】:2017-03-06 15:02:02 【问题描述】:

我有一个由 4 个部分组成的字符串变量,看起来像这样:

social_CA_FR_bloom_build

或者这个:

 social_DE_bloom_trgj4_67

(以及这个的不同变体)。

如何在 BigQuery 中编写正则表达式来提取子集,以便构建包含第一部分(社交)、第二部分 (CA_FR or DE etc)、第三部分(bloom)和第四部分(trgj4_67 or build, etc)的新列?

我已经试过了:

regexp_extract(field, "([^_]+)_([A-Z]2[_A-Z]*)_([^_]+)_(.+)", 1)

在 SQL (hive) 中有效,但在 BQ 中无效,因为它无法识别 (string, string, integer)。

我正在考虑用连字符替换 CA_FR 之间的下划线(应该放在一起并且只出现在几行中,通常只有两个大写字母),然后在字符串上使用 SPLIT 而不是 regex_extract,但我'不知道该怎么做/如果这是解决方案。

任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

一个想法是应用正则表达式,然后使用SPLIT。例如:

#standardSQL
SELECT
  parts[SAFE_OFFSET(0)] AS social,
  parts[SAFE_OFFSET(1)] AS language,
  parts[SAFE_OFFSET(2)] AS bloom,
  parts[SAFE_OFFSET(3)] AS build
FROM (
  SELECT
    SPLIT(REGEXP_REPLACE(
            label,
            r'([^_]+)_([A-Z]2[_A-Z]*)_([^_]+)_(.+)',
            r'\1|\2|\3|\4'),
          '|') AS parts
  FROM YourTable
);

我组成了列名——你可以使用任何你想要的名字。作为一个独立的例子:

#standardSQL
WITH YourTable AS (
  SELECT 'social_CA_FR_bloom_build' AS label UNION ALL
  SELECT 'social_DE_bloom_trgj4_67' AS label
)
SELECT
  parts[SAFE_OFFSET(0)] AS social,
  parts[SAFE_OFFSET(1)] AS language,
  parts[SAFE_OFFSET(2)] AS bloom,
  parts[SAFE_OFFSET(3)] AS build
FROM (
  SELECT
    SPLIT(REGEXP_REPLACE(
            label,
            r'([^_]+)_([A-Z]2[_A-Z]*)_([^_]+)_(.+)',
            r'\1|\2|\3|\4'),
          '|') AS parts
  FROM YourTable
);

【讨论】:

以上是关于如何从bigquery中的字符串中提取子集的主要内容,如果未能解决你的问题,请参考以下文章

从 Bigquery 中的 URL 中提取字符串

选择/提取 JSON 元素时的高效 BigQuery

Google BigQuery 使用 regexp_extract 从列中提取字符串

将数据从键值对提取到 Google Bigquery 中的列标题

BigQuery:如何取消转义额外转义/序列化的 JSON 字符串

bigquery 标准 sql = 从字符串中提取数据