我在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 .
添加到Luke的答案:如果修改源是不实际的,您可以在运行时添加转换器.
import jaydebeapi from jaydebeapi.dbapi2 import _DEFAULT_CONVERTERS, _java_to_py _DEFAULT_CONVERTERS.update({'BIGINT': _java_to_py('longValue')})
这解决了我使用jabdebeapi和Vertica时遇到的问题.
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以添加对BIGINT
s的支持相当容易.编辑__init__.py
包含大部分JayDeBeApi代码的文件并添加该行
'BIGINT': _java_to_py('longValue'),
到了这个词_DEFAULT_CONVERTERS
.