4

假设我有一个客户类,它有简单的字段,如名字、姓氏等,还有一个联系人列表作为字段,每个联系人对象都有一个电子邮件列表和一个电话号码列表。我已经知道 HBase 架构如何使用简单的字符串字段(如 firstName)。但我不确定如何保存嵌套字段(对象列表,每个都包含其他对象或数据类型的列表)。任何人都可以帮助我吗?

问候

Java 类:

public class Customer{
   private String id;
   private String userName;
   private String lastName;
   private List<Address> addresses;
   private List<Contact> contacts;
   private List<Objects> objects; // list of other possible objects
}

public class Address{
   private String homeNumber;
   private String street;
   private String city;
}

public class Contact{
   private List<String> emails;
}

HBase 架构:

Table: Customer
Row Key: id
Column Family: data [columns: userName, lastName]
Column Family: address [ columns: homeNumber, street, city ]
Column Family: contact ???

它如何与这里的联系人一起工作?或者我怎样才能拥有列表的其他地址条目?

问候


如何在客户表中保存一些地址?Put的方法:

add(byte[] family, byte[] qualifier, byte[] value) 

sujests 我只能有一个地址。对吗?对于“row1”,有以下示例:

add("adress", "homenumber", value);
add("adress", "street", value);
add("adress", "city", value);

那将是一个地址。我如何以这种方式为这个“row1”保存其他人?

问候,

4

2 回答 2

2

您希望您的集合成员拥有什么样的访问模式Customer应该决定您如何存储它们。

例如,您是否有理由只检索客户地址的一部分?可能不是。那么为什么不简单地拥有一个address列族,其中包含其限定符是地址的哈希码(或其他一些独特值)并且其单元格包含 JSON 数据的列?

客户联系人的访问模式是什么?对于这些,您可能有一个contact列族,其列限定符是联系人哈希码/ID,单元格内容是电子邮件。


address以下是具有两个地址的客户的列族的示例内容:

栏目:address:589F2AB09C
内容:{ "homenumber": 4, "street": "Cherry Ln", "city": "Pleasantville" }

栏目:address:FB94012AC4
内容:{ "homenumber": 100, "street": "Broadway", "city": "New York City" }

上面的哈希码列限定符是我刚刚编造的值。Address确实,您应该有一个将 an 映射到 a的哈希函数byte[],然后使用 thebyte[]作为限定符Address。编写该散列函数的一个好方法是 (1) 将您序列化为Addressa byte[],然后 (2) 计算其 SHA1 散列byte[]以获得新byte[]的 散列码。

如果您仍然不明白我在说什么,我想您可能会在尝试使用 HBase 时不知所措......

于 2013-08-07T20:58:04.597 回答
0

更新以包含您的示例:

HBase Schema:
Table: Customer
Row Key: id [id1]
Column Family: data
   userName: [user1]
   lastName: [name1]
Column Family: address
   homeNumber: [1234]
   street: [fake st.]
   city: [anywhere, USA]
Column Family: contacts
   contactList: [con1@email.com con2@email.com]

Table: Contacts
Row Key: emails [email1@email.com]

如果您只需要保留联系人电子邮件,那么您不需要额外的表格。如果您需要有关联系人的其他信息,则使用电子邮件(以空格分隔)作为行键在联系人表中查找

你将如何去做这件事实际上取决于你最终对数据做了什么。考虑到 HBase 并不真正喜欢宽表(如果我没记错的话,它会降低读取性能),这是我会采用的方法。

这是我想做的事情:

  1. 您需要某种唯一的联系人标识符,无论是 first_namelast_name 还是电子邮件或其他。
  2. 然后我会将这些联系人存储在单独的表中。HBase 不适用于太宽的表,如果您有列表列表,这很容易出现问题。另外,这使得拥有可变数量的联系人变得更加容易。将这些联系人放在一个单独的表中,然后您将引用它们以提取相关信息。
  3. 然后,您将引用包含在客户表的联系人列中,其中将是行键列表。您必须自己分隔这些列表,使用分号或波浪号之类的东西。

TL;DR 将客户和联系人分隔到单独的表中,然后在客户表中包含分隔的联系人行键列表。然后相应地解析和提取。

于 2013-08-07T12:51:00.883 回答