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

Ala*_*Ali 3 python jdbc jpype apache-spark jaydebeapi

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

import jaydebeapi
import jpype

conn = jaydebeapi.connect('org.apache.phoenix.jdbc.PhoenixDriver',
                  ['jdbc:phoenix:hostname', '', ''])
Run Code Online (Sandbox Code Playgroud)

我正在查询Apache Phoenix,它是Apache HBase的SQL"前端".

这是我的SQL查询的Python代码:

curs = conn.cursor()
curs.execute('select "username",count("username") from "random_data" GROUP BY "username"')
curs.fetchall()
Run Code Online (Sandbox Code Playgroud)

我得到的输出对于所有行都是这样的:

(u'Username', <jpype._jclass.java.lang.Long object at 0x25d1e10>)
Run Code Online (Sandbox Code Playgroud)

如何修复它以便它实际显示返回列(count列)的值?

Apache Phoenix数据类型页面,count列的数据类型是BIGINT,它被映射到java.lang.Long,但由于某种原因jpype不显示结果.

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

Luk*_*ard 8

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

>>> n = java.lang.Long(44)
>>> n
<jpype._jclass.java.lang.Long object at 0x2377390>
>>> n.value
44L
Run Code Online (Sandbox Code Playgroud)

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

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

    'BIGINT': _java_to_py('longValue'),
Run Code Online (Sandbox Code Playgroud)

到了这个词_DEFAULT_CONVERTERS.


den*_*ien 5

添加到Luke的答案:如果修改源是不实际的,您可以在运行时添加转换器.

import jaydebeapi
from jaydebeapi.dbapi2 import _DEFAULT_CONVERTERS, _java_to_py
_DEFAULT_CONVERTERS.update({'BIGINT': _java_to_py('longValue')})
Run Code Online (Sandbox Code Playgroud)

这解决了我使用jabdebeapi和Vertica时遇到的问题.

  • 这是一个很好的修复,但在版本 `1.1.1` 中,行 ` from jaydebeapi.dbapi2 import _D​​EFAULT_CONVERTERS, _java_to_py ` 应更改为 ` from jaydebeapi import _D​​EFAULT_CONVERTERS, _java_to_py ` (3认同)