我有一个Thrift php客户端,我想写一个HBase表,我正在做以下事情:
$mutations = array(
new Mutation( array(
'column' => 'entry:num',
'value' => array('a','b','c')
) ),
);
$client->mutateRow( $t, $row, $mutations );
问题是当在HBase中插入时,值(即数组)将转换为“Array”而不是存储数组的元素。 如何将列表存储为数组(或字节数组)
答案 0 :(得分:3)
HBase变异对象需要三个具有布尔/文本值的字段,而不是数组。因此,您需要将任何结构化值转换为字符串,例如。
$mutations = array(
new Mutation( array(
'isDelete' => FALSE,
'column' => 'entry:num',
'value' => serialize(array('a','b','c'))
) ),
);
$client->mutateRow( $t, $row, $mutations );
HBase Thrift API的定义在这里; http://svn.apache.org/viewvc/hbase/trunk/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift?view=markup
我没有测试过这个。
答案 1 :(得分:2)
我必须承认我不知道你想要做什么(也许是由于缺乏关于Thrift和HBase的知识),但如果我理解你的问题,那你就试着写一些PHP数据结构(在这种情况下为阵列)到存储介质。要实现这一点,您必须以某种方式序列化您的数据。这可能是使用自定义XML序列化,自定义二进制序列化,或者也许是最简单的解决方案,serialize()
提供的PHP内部序列化机制以及相应的unserialize()
。
如果您努力实现语言间互操作性,则应使用自定义序列化,或者必须编写反序列化函数,以使用目标语言对PHP序列化格式进行反序列化。
只是一个简单的例子 - 我不知道你要把这段代码放在哪里,因为我不确切知道你在做什么:
$mutations = array(
new Mutation(array(
'column' => 'entry:num',
'value' => array('a','b','c')
)),
);
$data = serialize($mutations); // $data now is a string
// write $data to storage
// read $readData from storage
$readMutations = unserialize($readData);
// $readMutations == $mutations
// (but the Mutation instances are not the same instances any more)
请参见