Написать массив PHP в HBase, используя Thrift - PullRequest
4 голосов
/ 12 мая 2009

У меня есть клиент Thrift php, и я хочу записать в таблицу HBase, и я делаю следующее:

  $mutations = array(
    new Mutation( array(
      'column' => 'entry:num',
      'value' => array('a','b','c')
    ) ),
  );
  $client->mutateRow( $t, $row, $mutations );

Проблема в том, что при вставке в HBase значение, являющееся массивом, преобразуется в массив, вместо хранения элементов массива. Как я могу сохранить список в виде массива (или байтового массива)

Ответы [ 2 ]

3 голосов
/ 12 февраля 2011

Объект мутации 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

Я не проверял это.

2 голосов
/ 12 мая 2009

Я должен признать, что я не имею понятия, что вы пытаетесь сделать (возможно, из-за недостатка знаний о Thrift и HBase), но если я правильно понял ваш вопрос, вы пытаетесь написать немного PHP структура данных (в данном случае массив) на носитель. Для этого вам нужно как-то сериализовать ваши данные. Это может быть использование пользовательской XML-сериализации, пользовательской двоичной сериализации или, возможно, наиболее простого решения, механизм внутренней сериализации PHP, предоставляемый serialize() и соответствующим 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)

Пожалуйста, смотрите

...