假设我有一个类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”保存其他人?
的问候,
答案 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并不真的喜欢宽表,这是我会采取的方法(如果我没记错的话,它会降低阅读的性能)。
以下是我要做的事情:
TL; DR将客户和联系人分隔到单独的表中,然后在customers表中包含联系人rowkeys的分隔列表。然后从中解析并拉出。