Ala*_*Ali 3 python jdbc jpype apache-spark jaydebeapi
我在PySpark中使用JayDeBeAPI(Apache Spark Python API),这是我的代码的开头(注意,我实际上是通过PySpark的交互式shell运行所有这些).
import jaydebeapi
import jpype
conn = jaydebeapi.connect('org.apache.phoenix.jdbc.PhoenixDriver',
['jdbc:phoenix:hostname', '', ''])
Run Code Online (Sandbox Code Playgroud)
我正在查询Apache Phoenix,它是Apache HBase的SQL"前端".
这是我的SQL查询的Python代码:
curs = conn.cursor()
curs.execute('select "username",count("username") from "random_data" GROUP BY "username"')
curs.fetchall()
Run Code Online (Sandbox Code Playgroud)
我得到的输出对于所有行都是这样的:
(u'Username', <jpype._jclass.java.lang.Long object at 0x25d1e10>)
Run Code Online (Sandbox Code Playgroud)
如何修复它以便它实际显示返回列(count列)的值?
从Apache Phoenix数据类型页面,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
Run Code Online (Sandbox Code Playgroud)
JayDeBeApi包含一个dict(_DEFAULT_CONVERTERS),它将它识别的类型映射到将Java值转换为Python值的函数.这个dict可以__init__.py在JayDeBeApi源代码的底部找到. BIGINT不包含在此dict中,因此该数据库类型的对象不会从Java对象映射到Python值.
修改JayDeBeApi以添加对BIGINTs的支持相当容易.编辑__init__.py包含大部分JayDeBeApi代码的文件并添加该行
'BIGINT': _java_to_py('longValue'),
Run Code Online (Sandbox Code Playgroud)
到了这个词_DEFAULT_CONVERTERS.
添加到Luke的答案:如果修改源是不实际的,您可以在运行时添加转换器.
import jaydebeapi
from jaydebeapi.dbapi2 import _DEFAULT_CONVERTERS, _java_to_py
_DEFAULT_CONVERTERS.update({'BIGINT': _java_to_py('longValue')})
Run Code Online (Sandbox Code Playgroud)
这解决了我使用jabdebeapi和Vertica时遇到的问题.
| 归档时间: |
|
| 查看次数: |
4383 次 |
| 最近记录: |