【问题标题】:Apply filters on HBase Column Family对 HBase 列族应用过滤器
【发布时间】:2018-03-20 08:55:04
【问题描述】:

我在 HBase 中有一个表,其中包含如下数据:

员工详细信息:

 997942                                column=Employee_details:Qualifications, timestamp=1520592579241, value=$ EmployeeCode:02404#EmployeeName:ABC
                                       #EducationLevel:#Course:#SubjectOfSpecialization:#InstituteName:#UniversityName:#CourseType:#ScoreType:#Sc
                                       ore:#StartYear:#EndYear:#EduHistoryID:#EmploymentStatus:Exited#ModifiedDate:#MinorSpecialization:General#IsTra
                                       ck:Yes#OrganizationID:19
 997942                                column=Employee_details:RefferelDetails, timestamp=1520592579241, value=$ EmployeeCode:02404#EmployeeName:ABC
                                       #Name:#ContactNumber:#Email:#Designation:#OrganizationName:#OrganizationAddress:#ReferenceRelationshipTyp
                                       e:#IsInternalReference:No#EmployeeCodeRef:#EmploymentStatus:Exited#EmployeeReferenceDetailID:#ModifiedDate:Nov
                                        16 2015  5:52PM#OrganizationID:19
 997942                                column=Employee_details:Skills, timestamp=1520592579241, value=$ EmployeeCode:02404#EmployeeName:ABC#Cer
                                       tificateLevel:#IsCompleted:#CompletionDate:#EmploymentStatus:Exited#ModifiedDate:#OrganizationID:19
 997942                                column=Employee_details:organizationid, timestamp=1520592579241, value=19

997942 是这个表的键。我只想使用 Java 提取 OrganizationID = 19 的记录,为此,我编写了以下代码:

HTable table = new HTable(config, "EmployeeDetails");
FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ALL);
    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("Employee_details"),
                        Bytes.toBytes("organizationid"), CompareFilter.CompareOp.EQUAL,
                        new BinaryComparator(Bytes.toBytes(String.valueOf("19"))));
list.addFilter(filter);
Scan scan = new Scan();
scan.setFilter(list);
scanner = table.getScanner(scan);

正在提取所有组织的数据。过滤器工作不正常。我们有其他选择吗?

【问题讨论】:

  • 顺便说一句,您的列名很长,这导致每次执行操作时都会移动+存储更多数据。
  • 你真的是指HTable table = new HTable(config, "TableName");吗?将"TableName" 替换为"EmployeeDetails"。并考虑从较小的规模开始 - 您可以进行扫描以检索该表的所有行吗?然后添加一个更简单的过滤器?然后将其构建为您想要的功能。
  • 我写了“TableName”,因为它是动态填充的。例如如果我正在获取 EmployeeDetails 数据,将传递 EmployeeDetails。
  • 如果我在 Hbase shell 上运行扫描,然后一一添加过滤器,代码运行正常,但 Java api 不运行
  • 如果您只在 Java 中不使用过滤器进行扫描怎么办?

标签: java hadoop mapreduce hbase


【解决方案1】:

问题出在

SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes(TableName),
    Bytes.toBytes("organizationid"), CompareFilter.CompareOp.EQUAL,
    new BinaryComparator(Bytes.toBytes(String.valueOf(organizationId))));

SingleColumnValueFilter的构造函数有签名

SingleColumnValueFilter(final byte [] family, final byte [] qualifier,
   final CompareOp compareOp, final byte[] value)

当它应该是列族时,您将第一个参数作为 TableName 给出。

改为使用:

SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("Employee_details"),
    Bytes.toBytes("organizationid"), CompareFilter.CompareOp.EQUAL,
    Bytes.toBytes(organizationId));

您也不需要FilterList,因为您只使用一个过滤器。

【讨论】:

  • 为我之前的代码道歉,我只使用 ColumnFamily。编辑了上面的代码。
  • 请您清理您的问题,以便它准确显示您实际运行的内容,作为重新创建此错误的最小示例?所以没有未定义的变量,没有通用字符串等。这对我有很大帮助。就目前而言,它仍然不正确(new HTable(config, "ColumnFamilyName"); 应该是表名),我认为整个BandDetails 是不必要的,因为它没有涉及任何地方。
  • TableName 和 ColumnFamily 正在动态填充,我错误地交换了两个值。现在修复了他们两个。添加了带表以供参考,以描述此代码在一种情况下运行良好,而在另一种情况下运行良好。
  • 它仍然显示new HTable(config, "TableName");,而ColumnFamilyNameorganizationId 未定义。如果不确切知道你运行了什么来得到这个错误,就不可能正确地调试它。
  • 您现在可以检查一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
相关资源
最近更新 更多