编程语言
首页 > 编程语言> > python – JPype和JayDeBeAPI返回jpype._jclass.java.lang.Long

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

作者:互联网

我在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>)

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

Apache Phoenix datatypes page开始,count列的数据类型是BIGINT,它映射到java.lang.Long,但由于某种原因,jpype没有显示结果.

当我下载它时,我通过python setup.py install获得了JayDeBeAPI 0.1.4和JPype 0.5.4.2.

解决方法:

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 in the JayDeBeApi source code的底部找到.BIGINT不包含在这个dict中,因此该数据库类型的对象不会从Java对象映射到Python值.

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

    'BIGINT': _java_to_py('longValue'),

到_DEFAULT_CONVERTERS字典.

标签:python,jdbc,apache-spark,jpype,jaydebeapi
来源: https://codeday.me/bug/20190714/1459318.html