在列中计算特定的子string文本

我有一个蜂巢表,标题为“UK.Choices”,标题为“水果”,每行的内容如下:

AppleBananaAppleOrangeOrangePears

BananaKiwiPlumAppleAppleOrange

KiwiKiwiOrangeGrapesAppleKiwi

等等

等等

有2.5M行,行比上面长得多。

我想要统计“苹果”一词出现的次数。 例如上面,它是:

“苹果”的数量= 5

我的SQL到目前为止是:

select 'Fruit' from UK.Choices 

然后在30万块,我复制并粘贴到Excel中,我更精通,能够使用公式做到这一点。 问题是,需要长达一个半小时才能生成每行30万行。

任何人都知道更快的方法来绕过Excel? 我可以做一些简单的事情,比如使用where子句来计数,但是像上面这样的事情现在已经超出了我的意思。 请帮忙。

谢谢。

如果水果名称之间有任何分隔符(例如:逗号),这是很简单的。 这个想法是将列拆分成一个数组,并使用“爆炸”function将数组分解成多行。

 SELECT fruit, count(1) as count FROM ( SELECT explode(split(Fruit, ',')) as fruit FROM UK.Choices ) X GROUP BY fruit 

从你的例子看来,水果是用大写字母分隔的。 一个想法是基于大写字母拆分列,假设没有后缀相同的水果。

 SELECT fruit_suffix, count(1) as count FROM ( SELECT explode(split(Fruit, '[AZ]')) as fruit_suffix FROM UK.Choices ) X WHERE fruit_suffix <> '' GROUP BY fruit_suffix 

不利的一面是,产量不会有水果的首字母,

 pple - 5 range - 4 

我想你想运行在一个select,并使用Hive if UDF来为不同的情况。 像下面的东西…

 select sum( if( fruit like '%Apple%' , 1, 0 ) ) as apple_count, sum( if( fruit like '%Orange%', 1, 0 ) ) as orange_count from UK.Choices where ID > start and ID < end; 

而不是上述查询中的连接。

我觉得我太迟了2年。 但是,既然我正在寻找同样的答案,我终于设法解决了这个问题,所以我认为这是一个好主意。

这是我怎么做的。

解决scheme1:

 +-----------------------------------+---------------------------+-------------+-------------+ | Fruits | Transform 1 | Transform 2 | Final Count | +-----------------------------------+---------------------------+-------------+-------------+ | AppleBananaAppleOrangeOrangePears | #Banana#OrangeOrangePears | ## | 2 | | BananaKiwiPlumAppleAppleOrange | BananaKiwiPlum##Orange | ## | 2 | | KiwiKiwiOrangeGrapesAppleKiwi | KiwiKiwiOrangeGrapes#Kiwi | # | 1 | +-----------------------------------+---------------------------+-------------+-------------+ 

这是它的代码:

 SELECT length(regexp_replace(regexp_replace(fruits, "Apple", "#"), "[A-Za-z]", "")) as number_of_apples FROM fruits; 

您的fruits栏中可能有数字或其他特殊字符,您可以修改第二个正则expression式来合并。 只要记住,在蜂巢逃避一个字符,你可能需要使用\\而不是一个\

解决scheme2:

 SELECT size(split(fruits,"Apple"))-1 as number_of_apples FROM fruits; 

这只是第一次使用“Apple”作为分隔符splitstring,并创build一个数组。 size函数只是告诉数组的大小。 请注意,数组的大小比分隔符的数量多一个。

没有蜂巢的经验,恐怕,所以这可能会或可能不会工作。 但在SQLServer,Oracle等我会做这样的事情:

假设你在行上有一个叫做ID的int PK,如下所示:

 select AppleCount, OrangeCount, AppleCount - OrangeCount score from ( select count(*) as AppleCount from UK.Choices where ID > start and ID < end and Fruit like '%Apple%' ) a, ( select count(*) as OrangeCount from UK.Choices where ID > start and ID < end and Fruit like '%Orange%' ) o 

如果电子表格中有所有的行,并且可以在那里计数,我会将总数除以总数。

然而,我迫切要求我的老板让我把Fruit字段变成一个FK选项和一个水果名字的表格。 除非这是你在Hive中无法做到的事情,否则这种devise会让小猫哭泣。

PS我错过了你想要的苹果发生的数量,这是不会做的。 我要离开我的答案了,因为我认为我的…然而… para实际上是一个很好的答案。 🙁