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