PyHive icon indicating copy to clipboard operation
PyHive copied to clipboard

Need Updates for python 3.10, using `collections.Iterable` as an example

Open ed9w2in6 opened this issue 2 years ago • 5 comments

System Info:

Python 3.10.0 | packaged by conda-forge | (default, Nov 20 2021, 02:25:18) [GCC 9.4.0]
pyhive 0.6.4    | pyhd8ed1ab_0   | conda-forge

Logs:

~/anaconda3/envs/****/lib/python3.10/site-packages/pyhive/hive.py in execute(self, operation, parameters, **kwargs)
    442             sql = operation
    443         else:
--> 444             sql = operation % _escaper.escape_args(parameters)
    445 
    446         self._reset_state()

~/anaconda3/envs/****/lib/python3.10/site-packages/pyhive/common.py in escape_args(self, parameters)
    211             return {k: self.escape_item(v) for k, v in parameters.items()}
    212         elif isinstance(parameters, (list, tuple)):
--> 213             return tuple(self.escape_item(x) for x in parameters)
    214         else:
    215             raise exc.ProgrammingError("Unsupported param format: {}".format(parameters))

~/anaconda3/envs/****/lib/python3.10/site-packages/pyhive/common.py in <genexpr>(.0)
    211             return {k: self.escape_item(v) for k, v in parameters.items()}
    212         elif isinstance(parameters, (list, tuple)):
--> 213             return tuple(self.escape_item(x) for x in parameters)
    214         else:
    215             raise exc.ProgrammingError("Unsupported param format: {}".format(parameters))

~/anaconda3/envs/****/lib/python3.10/site-packages/pyhive/common.py in escape_item(self, item)
    246         elif isinstance(item, basestring):
    247             return self.escape_string(item)
--> 248         elif isinstance(item, collections.Iterable):
    249             return self.escape_sequence(item)
    250         elif isinstance(item, datetime.datetime):

AttributeError: module 'collections' has no attribute 'Iterable'

This is because collections.Iterable is deprecated and we should use collections.abc.Iterable instead.

In fact, there has always been an DeprecationWarning in place:

DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.10 it will stop working

Are there any plans for a code review for such updates?

ed9w2in6 avatar Dec 21 '21 08:12 ed9w2in6

Can confirm that an environment with Python 3.10 breaks the code, which is working in Python 3.7.11

quickcoffee avatar Feb 16 '22 17:02 quickcoffee

As mentioned, the issue with collections.Iterable usage is that that has been moved to collections.abc.Iterable since python 3.3.

collections.Iterable is used in the default ParamEscaper here: https://github.com/dropbox/PyHive/blob/master/pyhive/common.py#L248

I should really just PR this (not sure they are being accepted since unsupported?), but for those in need of a quick fix, you can just monkey patch this particular problem with this:

collections.Iterable = collections.abc.Iterable

I know PyHive is unsupported. I'm just using the escaping functions to supplement some pyathena usage, where the escaping is currently extremely thin.

rwarren avatar Apr 26 '22 00:04 rwarren

[Off topic] I saw some recommended https://github.com/cloudera/impyla as an alternative. It seems that they provided a similar interface (DB API). I have not tried using it though.

ed9w2in6 avatar May 23 '22 03:05 ed9w2in6

Why is this not fixed for so long?

sscarduzio avatar Mar 31 '23 08:03 sscarduzio

Addressed in https://github.com/dropbox/PyHive/pull/451

mdeshmu avatar May 17 '23 16:05 mdeshmu