【发布时间】: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