我有一个hbase表,有100多万行和100多万列。每行只有2到5列的数据。只有一栏的家庭。
我想找出所有不同的 qualifiers (列)在此 column family . 有没有快速的方法?我可以考虑扫描整张table,然后 familyMap 对于每一行,获取 qualifier 并将其添加到 Set<> . 但这将是非常缓慢的,因为有100多米的行。我们能做得更好吗?
qualifiers
column family
familyMap
qualifier
Set<>
zazmityj1#
hbase协处理器可用于此场景。您可以编写自定义端点实现,其工作方式与rdbms中的存储过程类似。它在服务器端执行您的代码,并为每个区域获得不同的列。在客户端上,您可以跨所有区域获得不同的列。性能优势:不会将所有列传输到客户端,从而减少网络调用。
7uzetpgm2#
您可以使用mapreduce进行此操作。在本例中,您不需要像在协处理器中那样为hbase安装自定义libs。下面是创建mapreduce任务的代码。作业设置
Job job = Job.getInstance(config); job.setJobName("Distinct columns"); Scan scan = new Scan(); scan.setBatch(500); scan.addFamily(YOU_COLUMN_FAMILY_NAME); scan.setFilter(new KeyOnlyFilter()); //scan only key part of KeyValue (raw, column family, column) scan.setCacheBlocks(false); // don't set to true for MR jobs TableMapReduceUtil.initTableMapperJob( YOU_TABLE_NAME, scan, OnlyColumnNameMapper.class, // mapper Text.class, // mapper output key Text.class, // mapper output value job); job.setNumReduceTasks(1); job.setReducerClass(OnlyColumnNameReducer.class); job.setReducerClass(OnlyColumnNameReducer.class);
制图器
public class OnlyColumnNameMapper extends TableMapper<Text, Text> { @Override protected void map(ImmutableBytesWritable key, Result value, final Context context) throws IOException, InterruptedException { CellScanner cellScanner = value.cellScanner(); while (cellScanner.advance()) { Cell cell = cellScanner.current(); byte[] q = Bytes.copy(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()); context.write(new Text(q),new Text()); } }
}减速机
public class OnlyColumnNameReducer extends Reducer<Text, Text, Text, Text> { @Override protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { context.write(new Text(key), new Text()); } }
vbkedwbf3#
hbase可以可视化为一个分布式的 NavigableMap<byte[], NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>>> 对于所有区域服务器中可用的所有限定符的列表,没有“元数据”(例如集中存储在主节点中的内容)。因此,如果您有一个一次性用例,唯一的方法就是扫描整个表,并将限定符名称添加到 Set<> ,就像你提到的。如果这是一个重复的用例(再加上如果您有权将组件添加到您的技术堆栈中),您可能需要考虑添加redis。可以使用redis集以分布式方式维护一组限定符。
NavigableMap<byte[], NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>>>
3条答案
按热度按时间zazmityj1#
hbase协处理器可用于此场景。您可以编写自定义端点实现,其工作方式与rdbms中的存储过程类似。它在服务器端执行您的代码,并为每个区域获得不同的列。在客户端上,您可以跨所有区域获得不同的列。
性能优势:不会将所有列传输到客户端,从而减少网络调用。
7uzetpgm2#
您可以使用mapreduce进行此操作。在本例中,您不需要像在协处理器中那样为hbase安装自定义libs。下面是创建mapreduce任务的代码。
作业设置
制图器
}
减速机
vbkedwbf3#
hbase可以可视化为一个分布式的
NavigableMap<byte[], NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>>>
对于所有区域服务器中可用的所有限定符的列表,没有“元数据”(例如集中存储在主节点中的内容)。因此,如果您有一个一次性用例,唯一的方法就是扫描整个表,并将限定符名称添加到
Set<>
,就像你提到的。如果这是一个重复的用例(再加上如果您有权将组件添加到您的技术堆栈中),您可能需要考虑添加redis。可以使用redis集以分布式方式维护一组限定符。