在BigQuery中重复使用Regexp

时间:2013-11-21 09:32:54

标签: regex google-bigquery

我们讨论了在case子句中使用正则表达式的最佳方法...... 我们需要对提取的对象进行大小写操作。 这可以用几种方式表达。 问题是:哪一个会更有效?如果BQ出现在多个位置,BQ会多次处理正则表达式吗?

我已经调整了我的代码以在维基百科数据样本上运行。

第一

Select case when PS_Version='1' then '1st' 
            when PS_Version='2' then '2nd' 
            when PS_Version='3' then '3rd'
            else 'other' end as PS_VersionOrder
            from 
(SELECT regexp_extract(title,r'PlayStation (\d+)') as PS_Version
FROM [publicdata:samples.wikipedia] A
where title like '%PlayStation%'
limit 100)

第二

Select case when regexp_extract(title,r'PlayStation (\d+)')='1' then '1st' 
            when regexp_extract(title,r'PlayStation (\d+)')='2' then '2nd' 
            when regexp_extract(title,r'PlayStation (\d+)')='3' then '3rd'
            else 'other' end as PS_VersionOrder
FROM [publicdata:samples.wikipedia] A
where title like '%PlayStation%'
limit 100

正则表达式人士声称第一名将更有效率。 DB男人更喜欢第二个,因为它不涉及子查询...

2 个答案:

答案 0 :(得分:3)

我同意Alex的说法,但我会补充说,从执行的角度来看,第一个查询也会更好。 BigQuery非常有效地执行子查询,但可能不会在case子句中执行常见的子表达式消除(但是,它可能不会依赖它)。

答案 1 :(得分:2)

IMO,我会选择 1st

为什么?

1。维护

虽然第二个不包含子查询,但重复正则表达式。如果您决定稍后更改此正则表达式,则会使维护更加困难。

2。可读性

第二个不太可读。在理解代码之前,您必须阅读 long 冗余案例陈述。

3。用户体验

第二和第一可能会推迟表现。您应该测量执行两个查询所需的时间。然后检查时间差异(如果存在)是否会对您的最终用户体验产生明显的影响。

  • 例如,如果第二个以100毫秒击败第一个,那么人类就不会注意到它。
  • 如果查询涉及夜间批处理,请使用第1种方法。