irpas技术客

C# 在Hbase 中分批查询数据_agandefendou

大大的周 3638

hbase对于C# 这块的使用资料太少了,之前一直是索取,今天我也为社区做点贡献,将我所用到的贴出来,希望能帮忙到后面的童鞋。免得再去花费时间去做相同得事情。 最近也是有个项目用到了hbase,于是开始研究hbase的一些shell命令,以及C# 如何调用hbase api接口。 我使用了thrift的方式调用。 这个功能是需要hbase中分批查询数据,废话不多说,直接上贴代码。 public async Task<List<string>> GetRowKeysByConditionAsync(HbaseTScanCondition entity) { TSocketTransport transport = null; try { TScan scan = new TScan(); scan.Columns = entity.Columns; scan.FilterString = Encoding.UTF8.GetBytes(entity.FilterString); #region 处理数据通道 transport = this.GetTransport(); TBinaryProtocol tProtocol = new TBinaryProtocol(transport); if (!transport.IsOpen) { CancellationToken cancellationToken = new CancellationToken(); await transport.OpenAsync(cancellationToken); } THBaseService.Client client = new THBaseService.Client(tProtocol); #endregion List<string> list = new List<string>(); var id = await client.openScanner(Encoding.UTF8.GetBytes(entity.TableName), scan); int count = 0; do { var rows = await client.getScannerRows(id, entity.NumRow); foreach (var item in rows) { var res = item.ColumnValues; foreach (var item1 in res) { string rowKey = Encoding.UTF8.GetString(item.Row); list.Add(rowKey); } } count = rows.Count; } while (count > 0 && count == entity.NumRow); client.closeScanner(id).ConfigureAwait(false).GetAwaiter().GetResult(); return list; } catch (Exception ex) { } finally { if (transport.IsOpen) { transport.Close(); } } return null; }

这个方法是我用来查询满足过滤条件的RowKey的集合的,HbaseTScanCondition 是我自定义的类,这里我也贴出来

public class HbaseTScanCondition { public string TableName { get; set; } public string Family { get; set; } public List Columns { get; set; } //需要查询出来的列集合 public string FilterString { get; set; } /// /// 每次查询的行数 /// public int NumRow { get; set; } } hbase里面用的最多的是RowKey,而且需要操作的使用能用RowKey的尽量用RowKey。这个方法我直接查询出满足条件的RowKey,之后你可以再进行其他的对应操作。 这里其实最关键的是FilterString该怎么写,这个我也是花了很久的时间去研究这个,幸没有白费。这里的FilterString就是对应hbase shell里面的命令的过滤器。 对应的hbase过滤器,我放在下个文章里面介绍。这里我先直接跳过。 我在这里举一个FilterString的实例:

string FilterString=“PrefixFilter(‘00’)”; //这个是匹配行键前缀为00开始的所有行键的; 这里直接将FilterString的字符串传给HbaseTScanCondition.FilterString 中

在hbase shell使用中的实例如下: scan ‘student’,{LIMIT=>10,FILTER=>“PrefixFilter(‘00’)”}


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #C #在hbase #中分批查询数据 #hbase对于C #免得再去花费时间去做相同得事情