JPype和JayDeBeAPI返回jpype._jclass.java.lang.Long

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。

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值的函数。可以在JayDeBeApi源代码中的__init__.py底部找到此字典。该字典不包括BIGINT,因此该数据库类型的对象不会从Java对象映射到Python值。
很容易修改JayDeBeApi以添加对BIGINT的支持。编辑包含大部分JayDeBeApi代码的__init__.py文件,并添加以下行。
    'BIGINT': _java_to_py('longValue'),

_DEFAULT_CONVERTERS 字典添加进去。

谢谢,我已经将 BIGINT 添加到字典中了。有没有办法在不解析的情况下去掉尾随的 L? - Alaa Ali
@AlaaAli:末尾的“L”只是Python 2显示“long”的方式。n.value是一个值为44的Python“long”,而不是字符串“'44L'”。 - Luke Woodward
我已经在jaydebeapi的github项目中添加了一个问题。链接 - bastian
应该在https://github.com/baztian/jaydebeapi/tree/feature/improve-types-support中进行修复。欢迎提供任何反馈。 - bastian
只是提醒一下--这个评论帮助我修复了一个类似的问题,我遇到了迁移使用jaydebapi==0.2.0、JPype==0.6.3和python 2.7.13的旧版python程序连接到Amazon Redshift数据库时出现的问题。报错信息为[UserWarning: No type mapping for JDBC type 'BIT']。修复方法是添加以下代码行:from jaydebeapi import _DEFAULT_CONVERTERS, _java_to_py _DEFAULT_CONVERTERS.update({'BIT':_java_to_py('booleanValue')}) - Ouyang Ze

6

补充Luke的回答:如果修改源代码不可行,您可以在运行时添加转换器。

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

这解决了我在使用jabdebeapi与Vertica时遇到的问题。

2
这是一个很好的修复方式,但在版本 1.1.1 中,应将以下行进行更改: from jaydebeapi.dbapi2 import _DEFAULT_CONVERTERS, _java_to_py 更改为 from jaydebeapi import _DEFAULT_CONVERTERS, _java_to_py - tipanverella

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接