BigQuery:拆分具有重复模式的字符串以分隔行

Posted

技术标签:

【中文标题】BigQuery:拆分具有重复模式的字符串以分隔行【英文标题】:BigQuery: split string with repetitive pattern to separate rows 【发布时间】:2020-07-26 08:05:47 【问题描述】:

我有一个重复模式的字符串,例如:timestampField: <SOME_INT_VALUE> url: <SOME_STRING_VALUE>。正如您在示例中看到的那样,此模式返回多次(在此示例中为 4 次)。

SELECT my_string
FROM (SELECT 'timestampField: 1595351350 url: domainZ/aaaabbbbccccdddd timestampField: 1595351355 url: domainZ/eeeeffffgggghhhh timestampField: 1595351355 url: domainZ/iiiijjjjkkkkllll timestampField: 1595351356 url: domainZ/mmmmnnnnppppoooo' as my_string)

我想把这个大字符串分成 4 个(在这个例子中)不同的行,每一行都有一个字符串值

    timestampField: 1595351350 url: domainZ/aaaabbbbccccdddd timestampField: 1595351355 url: domainZ/eeeeffffgggghhhh timestampField: 1595351355 url: domainZ/iiiijjjjkkkkllll timestampField: 1595351356 url: domainZ/mmmmnnnnppppoooo

【问题讨论】:

【参考方案1】:

以下是 BigQuery 标准 SQL

一种简单的方法是使用 SPLIT,如下所示

#standardSQL
SELECT 'timestampField:' || v AS part
FROM `project.dataset.table`,
UNNEST(SPLIT(my_string, 'timestampField:')) v
WHERE NOT v = ''   

如果适用于您问题中的样本数据 - 输出是

Row part     
1   timestampField: 1595351350 url: domainZ/aaaabbbbccccdddd     
2   timestampField: 1595351355 url: domainZ/eeeeffffgggghhhh     
3   timestampField: 1595351355 url: domainZ/iiiijjjjkkkkllll     
4   timestampField: 1595351356 url: domainZ/mmmmnnnnppppoooo    

另一个使用正则表达式的选项,输出相同

#standardSQL
SELECT part
FROM `project.dataset.table`,
UNNEST(REGEXP_EXTRACT_ALL(my_string, r'timestampField: [^ ]* url: [^ ]*')) part

【讨论】:

两者都有效,太棒了!谢谢。 @Mikhail Berlyant 您能否解释一下第一个解决方案 - || 在 BigQuery 中的含义是什么? 它是Concatenation operator

以上是关于BigQuery:拆分具有重复模式的字符串以分隔行的主要内容,如果未能解决你的问题,请参考以下文章

PowerBI将分隔列拆分为重复行

BigQuery拆分列并获取每个子字符串的计数[重复]

拆分字符串,提取并添加到另一列正则表达式 BIGQUERY

Bigquery 导出拆分为多个文件,其中包含一些空文件

Spark将逗号分隔的行数组拆分为第一个值,其余的[重复]

在换行的情况下拆分字符串[重复]