3

私は PySpark (Apache Spark Python API) で JayDeBeAPI を使用してますこれが私のコードの始まりです (注意してください。実際には、これらすべてを PySpark の対話型シェルで実行しています)。

import jaydebeapi
import jpype

conn = jaydebeapi.connect('org.apache.phoenix.jdbc.PhoenixDriver',
                  ['jdbc:phoenix:hostname', '', ''])

Apache HBase の SQL「フロントエンド」であるApache Phoenixにクエリを実行しています。

SQL クエリの Python コードは次のとおりです。

curs = conn.cursor()
curs.execute('select "username",count("username") from "random_data" GROUP BY "username"')
curs.fetchall()

私が得ている出力は、すべての行で次のようになります。

(u'Username', <jpype._jclass.java.lang.Long object at 0x25d1e10>)

返された列 (列) の値を実際に表示するように修正するにはどうすればよいcountですか?

Apache Phoenix データ型ページから、列のデータ型countは BIGINT にマップされていますjava.lang.Longが、何らかの理由jpypeで結果が表示されていません。

ダウンロードした時点で、JayDeBeAPI 0.1.4 と JPype 0.5.4.2 を入手しpython setup.py installました。

4

3 に答える 3

11

JPype によって返されるオブジェクトは、Java のjava.lang.Longクラスの Python バージョンです。そこから値を取得するには、次のvalue属性を使用します。

>>> n = java.lang.Long(44)
>>> n
<jpype._jclass.java.lang.Long object at 0x2377390>
>>> n.value
44L

JayDeBeApi には、_DEFAULT_CONVERTERS認識される型を、Java 値を Python 値に変換する関数にマップする dict ( ) が含まれています。この dict は__init__.pyJayDeBeApi ソース コードの一番下にあります。 BIGINTはこの dict に含まれていないため、そのデータベース タイプのオブジェクトは Java オブジェクトから Python 値にマップされません。

JayDeBeApi を変更してBIGINTs のサポートを追加するのはかなり簡単です。__init__.pyJayDeBeApi コードの大部分を含むファイルを編集し、次の行を追加します。

    'BIGINT': _java_to_py('longValue'),

_DEFAULT_CONVERTERS口述に。

于 2014-11-16T15:04:05.583 に答える
5

Luke の回答に追加: ソースの変更が実用的でない場合は、実行時にコンバーターを追加できます。

import jaydebeapi
from jaydebeapi.dbapi2 import _DEFAULT_CONVERTERS, _java_to_py
_DEFAULT_CONVERTERS.update({'BIGINT': _java_to_py('longValue')})

これにより、Vertica で jabdebeapi を使用していた問題が修正されました。

于 2014-11-20T01:39:45.123 に答える
0

JayDeBeApi の作成者は、Java BigInteger の toString() メソッドと Python の int() 関数を介して、このメソッドを非常に大きな整数に変更する必要があるかもしれないと付け加えています: https://github.com/baztian/jaydebeapi/issues/6

于 2015-04-24T09:27:37.847 に答える