Skip to content

Commit 027e67f

Browse files
authored
Upgrade to 0.10.2 (#135)
1 parent 2b9f639 commit 027e67f

22 files changed

+401
-83
lines changed

cupid/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,4 @@
3333

3434
# mars app config
3535
options.register_option('cupid.image_prefix', None)
36-
options.register_option('cupid.image_version', '0.9.4rc3')
36+
options.register_option('cupid.image_version', 'v2.0')

docs/source/base-sqlalchemy.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ PyODPS 支持集成 SQLAlchemy,可以使用 SQLAlchemy 查询 MaxCompute 数
1717
from sqlalchemy import create_engine
1818
engine = create_engine('odps://<access_id>:<access_key>@<project>')
1919
20+
要在连接串中指定 ``endpoint``,可以按如下方式:
21+
22+
.. code-block:: python
23+
24+
from sqlalchemy import create_engine
25+
engine = create_engine('odps://<access_id>:<access_key>@<project>/?endpoint=<endpoint>')
26+
2027
这里把 ``<access_id>`` 等替换成相应的账号。
2128

2229
对于已有的 ODPS 对象 ``o`` ,调用 ``o.to_global()`` 设为全局账号后,在连接串中就不需要指定了。

odps/_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
version_info = (0, 10, 1)
15+
version_info = (0, 10, 2)
1616
_num_index = max(idx if isinstance(v, int) else 0
1717
for idx, v in enumerate(version_info))
1818
__version__ = '.'.join(map(str, version_info[:_num_index + 1])) + \

odps/accounts.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -293,26 +293,36 @@ def sign_request(self, req, endpoint):
293293

294294

295295
class BearerTokenAccount(BaseAccount):
296-
def __init__(self, token, expired_hours=5):
296+
def __init__(self, token, expired_hours=5, get_bearer_token_fun=None):
297297
self._token = token
298298
self._last_modified_time = None
299299
self._expired_time = timedelta(hours=expired_hours)
300+
self._get_bearer_token = get_bearer_token_fun or self.get_bearer_token
300301

301-
def _check_bearer_token(self):
302+
@staticmethod
303+
def get_bearer_token():
302304
from cupid import context
303305

304306
cupid_context = context()
305307
if cupid_context is None:
306308
return
307309

310+
return cupid_context.get_bearer_token()
311+
312+
def _check_bearer_token(self):
308313
t = datetime.now()
309314
if self._last_modified_time is None:
310-
token = cupid_context.get_bearer_token()
315+
token = self._get_bearer_token()
316+
if token is None:
317+
return
311318
if token != self._token:
312319
self._token = token
313320
self._last_modified_time = datetime.now()
314321
elif (t - self._last_modified_time) > self._expired_time:
315-
self._token = cupid_context.get_bearer_token()
322+
token = self._get_bearer_token()
323+
if token is None:
324+
return
325+
self._token = token
316326
self._last_modified_time = datetime.now()
317327

318328
@property
@@ -321,5 +331,8 @@ def token(self):
321331

322332
def sign_request(self, req, endpoint):
323333
self._check_bearer_token()
334+
url = req.url[len(endpoint):]
335+
url_components = urlparse(unquote(url), allow_fragments=False)
336+
self._build_canonical_str(url_components, req)
324337
req.headers['x-odps-bearer-token'] = self._token
325338
LOG.debug('headers after signing: ' + repr(req.headers))

odps/core.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ def __getstate__(self):
130130
return params
131131

132132
def __setstate__(self, state):
133+
if 'secret_access_key' in state:
134+
# if `secret_access_key` in state
135+
self._init(**state)
136+
return
133137
try:
134138
bearer_token = os.environ['ODPS_BEARER_TOKEN']
135139
state['project'] = os.environ['ODPS_PROJECT_NAME']
@@ -141,6 +145,9 @@ def __setstate__(self, state):
141145
except KeyError:
142146
self._init(**state)
143147

148+
def __mars_tokenize__(self):
149+
return self.__getstate__()
150+
144151
@classmethod
145152
def _from_account(cls, account, project, endpoint=DEFAULT_ENDPOINT,
146153
tunnel_endpoint=None, **kwargs):
@@ -1782,6 +1789,14 @@ def attach_session(self, session_name, taskname=None, hints=None):
17821789
session_project=project,
17831790
session_name=session_name)
17841791

1792+
def default_session(self):
1793+
"""
1794+
Attach to the default session of your project.
1795+
1796+
:return: A SessionInstance you may execute select tasks within.
1797+
"""
1798+
return self.attach_session('public.default')
1799+
17851800
def create_session(self, session_worker_count, session_worker_memory,
17861801
session_name=None, worker_spare_span=None, taskname=None, hints=None):
17871802
"""

odps/dbapi.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,13 +139,18 @@ def description(self):
139139
return
140140
if self._description is None:
141141
self._check_download_session()
142+
self._description = []
142143
if self._download_session is not None:
143-
self._description = []
144144
for col in self._download_session.schema.columns:
145145
self._description.append((
146146
col.name, col.type.name,
147147
None, None, None, None, True
148148
))
149+
else:
150+
self._description.append((
151+
'_c0', 'string', None, None,
152+
None, None, True
153+
))
149154
return self._description
150155

151156
@staticmethod
@@ -208,8 +213,18 @@ def _check_download_session(self):
208213
# not select, cannot create session
209214
self._download_session = None
210215

216+
def _fetch_non_select(self):
217+
# not select
218+
# just return reader.raw
219+
with self._instance.open_reader() as reader:
220+
return [(reader.raw,)]
221+
211222
def _fetch(self, size):
212223
self._check_download_session()
224+
225+
if self._download_session is None:
226+
return self._fetch_non_select()
227+
213228
results = []
214229
i = 0
215230
while size == -1 or i < size:

odps/mars_extension/__init__.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,15 @@
4949
pass
5050

5151

52+
# register filesystem
53+
try:
54+
from mars.filesystem import file_systems
55+
from .filesystem import VolumeFileSystem
56+
57+
file_systems['odps'] = VolumeFileSystem
58+
except ImportError:
59+
pass
60+
61+
5262
INTERNAL_PATTERN = '\/[^\.]+\.[^\.-]+\.[^\.-]+\-[^\.-]+\.'
5363

odps/mars_extension/core.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ def create_mars_cluster(odps, worker_num=1, worker_cpu=8, worker_mem=32, cache_m
145145
disk_size = int(disk_size * 1024 ** 3)
146146
scheduler_mem = int(scheduler_mem * 1024 ** 3) if scheduler_mem else None
147147
web_mem = int(web_mem * 1024 ** 3) if web_mem else None
148-
notebook_mem = int(notebook_mem * 1024 ** 3) if web_mem else None
148+
notebook_mem = int(notebook_mem * 1024 ** 3) if notebook_mem else None
149149

150150
kw = dict(worker_num=worker_num, worker_cpu=worker_cpu, worker_mem=worker_mem,
151151
worker_cache_mem=cache_mem, min_worker_num=min_worker_num,
@@ -176,7 +176,7 @@ def to_mars_dataframe(odps, table_name, shape=None, partition=None, chunk_bytes=
176176
:param use_arrow_dtype: read to arrow dtype. Reduce memory in some saces.
177177
:return: Mars DataFrame.
178178
"""
179-
from cupid import context
179+
from cupid.runtime import RuntimeContext
180180
from .dataframe import read_odps_table
181181
from ..utils import init_progress_ui
182182

@@ -204,7 +204,7 @@ def to_mars_dataframe(odps, table_name, shape=None, partition=None, chunk_bytes=
204204

205205
# get dataframe's shape
206206
if shape is None:
207-
if calc_nrows and context() is None:
207+
if calc_nrows and not RuntimeContext.is_context_ready():
208208
# obtain count
209209
if partition is None:
210210
odps_df = data_src.to_df()

odps/mars_extension/dataframe/datasource.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,14 @@ def tile(cls, op):
125125
from odps import ODPS
126126
from odps.accounts import BearerTokenAccount
127127
from cupid import CupidSession, context
128+
from cupid.runtime import RuntimeContext
128129
from mars.context import get_context
129130

130-
cupid_ctx = context()
131-
if cupid_ctx is None:
131+
if not RuntimeContext.is_context_ready():
132132
raise SystemError('No Mars cluster found, please create via `o.create_mars_cluster`.')
133133

134+
cupid_ctx = context()
135+
134136
bearer_token = cupid_ctx.get_bearer_token()
135137
account = BearerTokenAccount(bearer_token)
136138
project = os.environ.get('ODPS_PROJECT_NAME', None)
@@ -190,8 +192,6 @@ def tile(cls, op):
190192
logger.warning('Estimated chunk rows: %r', est_chunk_rows)
191193

192194
out_chunks = []
193-
# Ignore add_offset at this time.
194-
op._add_offset = False
195195

196196
if len(download_session.splits) == 0:
197197
logger.debug('Table {} has no data'.format(op.table_name))

odps/mars_extension/dataframe/datastore.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,12 @@ def tile(cls, op):
105105
from odps import ODPS
106106
from odps.accounts import BearerTokenAccount
107107
from cupid import CupidSession, context
108+
from cupid.runtime import RuntimeContext
108109
from mars.dataframe.utils import build_concatenated_rows_frame
109110

110-
cupid_ctx = context()
111-
if cupid_ctx is None:
111+
if not RuntimeContext.is_context_ready():
112112
raise SystemError('No Mars cluster found, please create via `o.create_mars_cluster`.')
113+
cupid_ctx = context()
113114

114115
bearer_token = cupid_ctx.get_bearer_token()
115116
account = BearerTokenAccount(bearer_token)
@@ -146,7 +147,7 @@ def tile(cls, op):
146147
# build commit tree
147148
combine_size = 8
148149
chunks = out_chunks
149-
while len(chunks) > combine_size:
150+
while len(chunks) >= combine_size:
150151
new_chunks = []
151152
for i in range(0, len(chunks), combine_size):
152153
chks = chunks[i: i + combine_size]

0 commit comments

Comments
 (0)