HBase:如何用列表列表等嵌套字段保存对象?

时间:2013-08-07 12:19:18

标签: hbase

假设我有一个类Customer,它有简单的字段,如firstName,lastName等,还有一个Contacts列表作为字段,每个Contact对象都有一个电子邮件列表和一个电话号码列表。我已经知道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 ???

这里的联系方式如何?或者如何获得列表的其他地址条目?

问候


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

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

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

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

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

的问候,

2 个答案:

答案 0 :(得分: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映射到byte[],然后使用byte[]作为Address的限定符。编写该哈希函数的一种好方法是(1)将Address序列化为byte[],然后(2)计算byte[]的SHA1哈希以获得新的byte[] ,哈希码。

如果你仍然不明白我在说什么,我想你可能会试图使用HBase ......

答案 1 :(得分: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. 然后,您可以在customer表的contacts列中包含引用,其中它是rowkeys的列表。您必须自己分隔这些列表,例如分号或波浪号。
  4. TL; DR将客户和联系人分隔到单独的表中,然后在customers表中包含联系人rowkeys的分隔列表。然后从中解析并拉出。