5

Thrift php クライアントがあり、HBase テーブルに書き込みたいのですが、次のことを行っています。

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

問題は、HBase に挿入するときに、配列である値が、配列の要素を格納する代わりに「配列」に変換されることです。リストを配列(またはバイト配列)として保存するにはどうすればよいですか

4

2 に答える 2

3

HBaseミューテーションオブジェクトには、配列ではなく、ブール値/テキスト値を持つ3つのフィールドが必要です。したがって、構造化された値を次のような文字列に変換する必要があります。

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

HBaseThriftAPIの定義はここにあります。 http://svn.apache.org/viewvc/hbase/trunk/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift?view=markup

私はこれをテストしていません。

于 2011-02-11T23:48:30.853 に答える
2

私はあなたが何をしようとしているのか(おそらく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)

ご覧ください

于 2009-05-12T08:08:04.023 に答える