所以,让我们看看我能否简单解释一下我的问题。
想象一下,我们有一个HBase表,其中包含每次访问迪斯科舞厅的信息: 每个迪斯科都会注册其名称,访客的名称以及他访问过的日。 ( 是的,这是一个愚蠢的例子,我知道 .. )。
因此,例如,这些将是表格的一些值:
..
ministryOfSoundJamesOliver01022017
ministryOfSoundJamesOliver02022017
ministryOfSoundJamesOliver03022017
ministryOfSoundOliviaNewton04042017
ministryOfSoundOliviaNewton06042017
...
pachaibizaJohnMcKiness06042017
pachaibizaJohnMcKiness04042017
pachaibizaWilliamForrester04042017
..
RowKey 具有以下结构:
discoName
PERSONNAME
dayOfTheYear
(该表还有其他一些专栏/限定符,但我对此问题并不介意。)
问题是:想象一个只喜欢去声音部的男孩。他只是喜欢它,他把所有的钱花在迪斯科和毒品上(但这不是重点)。
我的目标是输出每个参加过Ministry of Sound 的人。在我的扫描中,这个家伙一直出现在结果中,所以我必须丢弃很多条目来搜索下一个访客。 F.E:
..
ministryOfSoundJohnnyYonkie01022017
ministryOfSoundJohnnyYonkie02022017
ministryOfSoundJohnnyYonkie03022017
ministryOfSoundJohnnyYonkie04022017
ministryOfSoundJohnnyYonkie05022017
ministryOfSoundAnotherDude02022017
...
要注册 AnotherDude ,我必须从 Johnny 中丢弃4个条目。
最后,问题是:
有没有办法告诉HBase从字节(x)到字节(x + y)的重复条目[ x 是来自discoName
的字节数和y数来自personName
]的字节必须自动丢弃?
提前多多感谢!!
答案 0 :(得分:2)
首先要做的事情:如果您只有客户访问权限,我无法帮助您:(
如果您有其他访问权限,那么您可以查看以下提议,但默认回复将是: 如果这是您的访问模式,请为其优化架构。
如果您需要以某种方式访问数据,请确保首先以这种方式编写数据。如果必须执行迁移,请使用map-reduce API。
我可能只是添加一个表,它只写一行ministryOfSound和每个访问者一列。 (一般来说,你提出的模式听起来不太适合HBase - 因为你有一堆单调增加的行密钥写入,如果对重复结果进行后处理实际上是一个性能问题)
另一方面,如果这是一个临时查询,那么您可能希望立即使用mapreduce-API - 可能使用Apache Spark-interconnect并对数据执行“不同”调用。
使用扫描进行分析查询不是我的方法。
如果你必须使用Scans,那么我建议你实现一个CoProcessor。这些可以使用state扩充Filter,并且可以在Region Server端投影PrefixFilter'd Scan的结果。如果您是CoProcessors的新手,请参阅:HBase: The Definitive Guide。这要求您可以将jar部署到RegionServer类路径中。
但同样,如果你通过在那里做一个明显的过滤来炸毁你的客户,你可能也因为插页上的热点而炸毁了你的区域。
作为最后的替代方案:您可能希望查看Apache Phoenix,看看是否可以将您的rowkey强制转换为模式,从中可以对rowkey的前两部分执行select distinct。这显然要求你在rowkey中有分隔符,或者至少需要一个固定的长度。