在配置单元中过滤出字符串列的最佳方法是什么?

wribegjk  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(207)

我正在筛选一个名为mycolumn的字符串列。我能想到以下3种过滤方法,哪种会达到更好的性能?

-- method #1
where
(   mycolumn = 'FixedStringA.FixedStringB.VariableStringA.FixedString' 
OR mycolumn = 'FixedStringA.FixedStringB.VariableStringB.FixedString' 
OR mycolumn = 'FixedStringA.FixedStringB.VariableStringC.FixedString' 
OR mycolumn = 'FixedStringA.FixedStringB.VariableStringD.FixedString' );

-- method #2
where mycolumn like '%//.FixedString';

-- method #3
where split(mycolumn,'//.')[3] = 'FixedString';

请知道fixedstringa和fixedstringb就像常量,它们的值将保持不变,这就是为什么称它们为固定字符串。mycolumn不是您信息的分区键。

sz81bmfz

sz81bmfz1#

在方法3中,应该是 \\. 不是 //. 看看这个答案:regexp中的dot
同样在方法2中,它可能应该是 like '%.FixedString' 你也可以像这样使用:

RLIKE '\\.FixedString$'

您不会注意到配置单元中的差异,因为它无论如何都是完全扫描,并且是并行运行的。
我更喜欢 RLIKE '\\.FixedString$' 因为它很短而且像regexp一样强大。
拆分和生成数组(方法3)将对内存和垃圾收集器造成更大的压力,您将创建和释放更多的对象。
方法一也不错,但看起来不那么优雅。如果您有orc文件中的内部索引,方法1会更好,您需要自己检查它。

相关问题