1

假设我有一个 Hive 查询,看起来像这样:

SELECT COUNT(*) FROM my_table WHERE
    col1 LIKE "%str1%"         -- matches 1% of rows
    OR col1 LIKE "%str2%"      -- matches 1% of rows
    OR col1 LIKE "%str3%"      -- matches 0 rows
    OR col1 LIKE "%str4%"      -- matches 90% of rows
    (...more...);

如果我匹配的其中一些字符串比其他字符串更常见,我想知道从移动col 1 LIKE "%str4%"到这个列表的顶部我会得到什么(如果有的话)性能提升。

上面的例子有点简单,但是如果这些OR操作中的每一个都是一个长字符串上的正则表达式匹配,我想执行 3 个几乎所有时间都失败的匹配 ( str1, str2, ) 的时间会变得非常昂贵。str3

Hive 是否按顺序循环执行这些操作并在确定true匹配时中断?我想有必要问一下等效的 Pig 操作是否也能以这种方式工作。

4

1 回答 1

2

对于 Pig,Programming Pig中的以下内容应澄清:

Pig 会在可能的情况下将布尔运算短路。如果 and 的第一个(左)谓词为假,则不会计算第二个(右)谓词。所以在 1 == 2 和 udf(x) 中,UDF 永远不会被调用。同样,如果 or 的第一个谓词为真,则不会计算第二个谓词。1 == 1 或 udf(x) 永远不会调用 UDF。

因此,如果您的每个逻辑运算符都执行一些重量级的操作,然后重新排序它们,以便它们在第一个条件下短路 90% 的记录应该会给您带来一些性能提升。请注意,YMMV 用于“一些性能提升”,因为它会根据逻辑操作的总数(示例仅给出 4 个,可能还有更多)、正则表达式短路的复杂性以及数据的大小/特征而有所不同被匹配。

于 2013-08-02T02:53:18.863 回答