首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPype和JayDeBeAPI返回jpype._jclass.java.lang.Long

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

Stack Overflow用户
提问于 2014-11-13 01:00:43
回答 3查看 6.4K关注 0票数 3

我在PySpark中使用PySpark( 阿帕奇火花 Python ),下面是我的代码的开头(注意,我实际上是通过与PySpark交互的shell来运行这一切的)。

代码语言:javascript
复制
import jaydebeapi
import jpype

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

我正在查询阿帕奇凤凰,它是Apache HBase的一个SQL“前端”。

下面是SQL查询的Python代码:

代码语言:javascript
复制
curs = conn.cursor()
curs.execute('select "username",count("username") from "random_data" GROUP BY "username"')
curs.fetchall()

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

代码语言:javascript
复制
(u'Username', <jpype._jclass.java.lang.Long object at 0x25d1e10>)

如何修复它,使其能够实际显示返回列( count列)的值?

Apache凤凰社数据类型页中,count列的数据类型是BIGINT,它被映射到java.lang.Long,但出于某种原因,jpype没有显示结果。

我下载JayDeBeAPI 0.1.4和JPype 0.5.4.2是由python setup.py install提供的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-16 15:04:05

JPype返回的对象是java.lang.Long类的Python版本。要获得它的值,请使用value属性:

代码语言:javascript
复制
>>> n = java.lang.Long(44)
>>> n
<jpype._jclass.java.lang.Long object at 0x2377390>
>>> n.value
44L

JayDeBeApi包含一个dict (_DEFAULT_CONVERTERS),它将它识别的类型映射到将Java转换为Python的函数。这个数据集可以在在JayDeBeApi源代码中的底部找到。这个数据库中没有包含BIGINT,所以数据库类型的对象不会从Java映射到Python。

修改JayDeBeApi以添加对BIGINT的支持是相当容易的。

代码语言:javascript
复制
    'BIGINT': _java_to_py('longValue'),

_DEFAULT_CONVERTERS的人。

票数 11
EN

Stack Overflow用户

发布于 2014-11-20 01:39:45

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

代码语言:javascript
复制
import jaydebeapi
from jaydebeapi.dbapi2 import _DEFAULT_CONVERTERS, _java_to_py
_DEFAULT_CONVERTERS.update({'BIGINT': _java_to_py('longValue')})

这解决了我和Vertica一起使用jabdebeapi的问题。

票数 6
EN

Stack Overflow用户

发布于 2015-04-24 09:27:37

JayDeBeApi作者补充说,这个方法可能需要通过Java的toString()方法和https://github.com/baztian/jaydebeapi/issues/6的int()函数来修改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26899595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档