3

我在 PySpark(Apache Spark Python API)中使用JayDeBeAPI,这是我的代码的开头(注意,我实际上是通过带有 PySpark 的交互式 shell 运行所有这些)。

import jaydebeapi
import jpype

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

我正在查询Apache Phoenix,它是 Apache HBase 的 SQL“前端”。

这是我用于 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没有显示结果。

python setup.py install当我下载它们时,我得到了 JayDeBeAPI 0.1.4 和 JPype 0.5.4.2 。

4

3 回答 3

11

JPype 返回的对象是 Javajava.lang.Long类的 Python 版本。要从中获取值,请使用value属性:

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

JayDeBeApi 包含一个 dict ( _DEFAULT_CONVERTERS),它将它识别的类型映射到将 Java 值转换为 Python 值的函数。这个字典可以__init__.py在 JayDeBeApi 源代码的底部找到。 BIGINT不包含在此字典中,因此该数据库类型的对象不会从 Java 对象映射到 Python 值。

修改 JayDeBeApi 以添加对BIGINTs 的支持相当容易。编辑__init__.py包含大部分 JayDeBeApi 代码的文件并添加该行

    'BIGINT': _java_to_py('longValue'),

_DEFAULT_CONVERTERS听写。

于 2014-11-16T15:04:05.583 回答
5

添加到卢克的答案:如果修改源不切实际,您可以在运行时添加转换器。

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 回答