C# 在Hbase 中分批查询数据

 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值