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

 狡兔死走狗喷Henry 发布于 2022-12-11 20:02

我在PySpark中使用JayDeBeAPI(Apache Spark Python API),这是我的代码的开头(注意,我实际上是通过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', )

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

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

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

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

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

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

    2022-12-11 20:06 回答
  • 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包含一个dict(_DEFAULT_CONVERTERS),它将它识别的类型映射到将Java值转换为Python值的函数.这个dict可以__init__.py在JayDeBeApi源代码的底部找到. BIGINT不包含在此dict中,因此该数据库类型的对象不会从Java对象映射到Python值.

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

        'BIGINT': _java_to_py('longValue'),
    

    到了这个词_DEFAULT_CONVERTERS.

    2022-12-11 20:06 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有