1

^_^ 皆さんこんにちは。

thrift の C++ でメソッド「scannerOpenWithScan()」と filterString を使用するにはどうすればよいですか。hbase のバージョンは hbase-0.92.1 です。

列の値に応じて行を選択したいので、「examples/thrift/DemoClient.cpp」に scannerOpenWithScan() を追加しました。

/**
* open a scanner with scan (filter string)
*/
320     TScan tscan;
321     std::string filterStr;
322     filterStr = "SingleColumnValueFilter (<=, '25', 'entry', 'num', true, false)";
323     tscan.__set_filterString(filterStr);       
324         
325     std::cout << "Starting scanner with scan..." << std::endl;
326     scanner = client.scannerOpenWithScan(t, tscan); 
327     std::cout << "The scanner id is " << scanner << std::endl;
328     try { ...... }

しかし、スキャナー ID が返されません。エラーは次のとおりです。

Starting scanner with scan...
ERROR: No more data to read.

thrift.log エラーは次のとおりです。

796 java.lang.IllegalArgumentException: Incorrect filter string SingleColumnValueFilter(<=, '25', 'entry', 'num', true, false)
797         at org.apache.hadoop.hbase.filter.ParseFilter.parseSimpleFilterExpression(ParseFilter.java:250)
798         at org.apache.hadoop.hbase.filter.ParseFilter.parseFilterString(ParseFilter.java:168)
799         at org.apache.hadoop.hbase.thrift.ThriftServer$HBaseHandler.scannerOpenWithScan(ThriftServer.java:766)

thrift.out は次のとおりです。

java.lang.reflect.InvocationTargetException
  6         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  7         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  8         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  9         at java.lang.reflect.Method.invoke(Method.java:616)
 10         at org.apache.hadoop.hbase.filter.ParseFilter.parseSimpleFilterExpression(ParseFilter.java:240)
 11         at org.apache.hadoop.hbase.filter.ParseFilter.parseFilterString(ParseFilter.java:168)
 12         at org.apache.hadoop.hbase.thrift.ThriftServer$HBaseHandler.scannerOpenWithScan(ThriftServer.java:766)
 13         at org.apache.hadoop.hbase.thrift.generated.Hbase$Processor$scannerOpenWithScan.getResult(Hbase.java:3821)

私はそれについて何も知りません。フィルター機能を備えた C++ を使用して HBase にアクセスする方法を知っている人はいますか?

4

1 に答える 1

6

これで答えがわかりました。フィルター文字列が正しくありません。正しいのは次のとおりです。

filterStr = "SingleColumnValueFilter('entry', 'num', =, 'substring:25', true, false)";

正しい構文は次のとおりです。

SingleColumnValueFilter('<family>', '<qualifier>', <compare operator>, '<comparator>', <filterIfColumnMissing_boolean>, <latest_version_boolean>)

詳細は https://issues.apache.org/jira/browse/HBASE-5946を参照

于 2012-07-10T01:46:15.407 に答える