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

Posted

技术标签:

【中文标题】bigquery 标准 sql = 从字符串中提取数据【英文标题】:bigquery standard sql = extracting data from strings 【发布时间】:2019-09-11 09:25:16 【问题描述】:

我希望从指定字母之后的字符串中提取部分内容,例如从以下字符串中:

wc:275,nwc:267,c1.3:2,c12.1:25,c12.10:39,c12.12:21,c12.13:4

我希望提取 275(用于 wc)、2(用于 c1.3)和 25(用于 c12.1)。

我已经尝试了以下,但字段重新设置,ridanxietycnt 和 wordcount 只显示“NULL”。

SELECT substr(CAST((DATE) AS STRING),0,8) as daydate,
count(1) as count,
avg(CAST(REGEXP_REPLACE(V2Tone, r',.*', "")AS FLOAT64)) tone,
avg(CAST(REGEXP_EXTRACT(GCAM, r'c1.3:([-d.]+)')AS FLOAT64)) anew,
sum(CAST(REGEXP_EXTRACT(GCAM, r'c12.1:([-d.]+)')AS FLOAT64)) ridanxietycnt, 
sum(CAST(REGEXP_EXTRACT(GCAM, r'wc:(d+)')AS FLOAT64)) wordcount   
FROM `gdelt-bq.gdeltv2.gkg_partitioned` where _PARTITIONTIME BETWEEN TIMESTAMP('2019-02-02') AND TIMESTAMP('2019-02-02') 
group by daydate

我希望看到每列的汇总数字。

我想知道问题是否与正则表达式有关?

【问题讨论】:

【参考方案1】:

您可以将它们视为简单的键/值对,然后在其之上进行聚合。比如:

select 
   substr(CAST((DATE) AS STRING),0,8) as daydate,
   split(x,':')[safe_offset(0)] as key, 
   cast(split(x,':')[safe_offset(1)] as float64) as value
from `gdelt-bq.gdeltv2.gkg_partitioned`, 
unnest(split(GCAM, ',')) as x
where _PARTITIONTIME BETWEEN TIMESTAMP('2019-02-02') AND TIMESTAMP('2019-02-02')

希望这会有所帮助。

【讨论】:

【参考方案2】:

这应该让您按此顺序获得 2(重新)、25(ridanxietycnt)、275(字数)

SELECT
SAFE_CAST(REGEXP_EXTRACT('wc:275,nwc:267,c1.3:2,c12.1:25,c12.10:39,c12.12:21,c12.13:4', r'c1.3:(\d+)') as FLOAT64) anew,
SAFE_CAST(REGEXP_EXTRACT('wc:275,nwc:267,c1.3:2,c12.1:25,c12.10:39,c12.12:21,c12.13:4', r'c12.1:(\d+)') as FLOAT64) ridanxietycnt, 
SAFE_CAST(REGEXP_EXTRACT('wc:275,nwc:267,c1.3:2,c12.1:25,c12.10:39,c12.12:21,c12.13:4', r'wc:(\d+)') as FLOAT64) wordcount  

【讨论】:

以上是关于bigquery 标准 sql = 从字符串中提取数据的主要内容,如果未能解决你的问题,请参考以下文章

在 bigquery 标准 sql 上提取两个日期之间的小时数

无法将 bigquery 与标准 sql 一起使用

Google BigQuery SQL:从 JSON(列表和数组)中提取数据到列中

bigquery 标准 sql 获取 dayofweek

Bigquery STRING 数组到 INT 数组

BigQuery 标准 SQL 中的“yearweek”函数的等价物是啥?