【问题标题】:repeated Regexp in BigQueryBigQuery 中的重复正则表达式
【发布时间】:2013-12-05 16:41:45
【问题描述】:

我们就在 case 子句中使用正则表达式的最佳方式进行了辩论... 我们需要对提取的对象进行案例操作。 这可以用几种方式表达。 问题是:哪个更有效?如果正则表达式出现在多个位置,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

人们声称第一个正则表达式会更有效率。数据库人更喜欢第二个,因为它不涉及子查询...

【问题讨论】:

    标签: regex google-bigquery


    【解决方案1】:

    IMO,我会选择第一个

    为什么?

    1。维护

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

    2。可读性

    第二个可读性较差。在理解代码之前,您必须阅读 long 多余的 case 语句。

    3。用户体验

    第 2 次和第 1 次的性能可能会有所延迟。您应该测量执行这两个查询所需的时间。然后检查时间差异(如果存在)是否对您的最终用户体验有明显影响。

    • 例如,如果第 2 次以 100 毫秒击败第 1 次,人类不会注意到它。
    • 如果查询涉及每晚批处理,请使用第一种方法。

    【讨论】:

    • 谢谢亚历克斯。我想更好地了解 BQ 引擎如何处理这些?它是只处理一次正则表达式(就像其他一些数据库引擎那样)还是重复多次,如果它被多次表达。
    • 我的回答是完全不可知论的。我不能说 BQ 引擎是如何处理这个的。但是,您可以在其他地方搜索(论坛、谷歌、BQ 文档...)或尝试两种查询并确定哪一个在内存消耗、代码速度等方面更好
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2013-06-10
      • 2015-04-08
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多