def _stream_query(self, query): """ Stream rows from a query. This method will yield rows as the data is returned in chunks from the server. """ self.description = None headers = {'Content-Type': 'application/json'} payload = {'query': query} r = requests.post(self.url, stream=True, headers=headers, json=payload) if r.encoding is None: r.encoding = 'utf-8' # raise any error messages if r.status_code != 200: payload = r.json() msg = ('{error} ({errorClass}): {errorMessage}'.format(**payload)) raise exceptions.ProgrammingError(msg) # Druid will stream the data in chunks of 8k bytes, splitting the JSON # between them; setting `chunk_size` to `None` makes it use the server # size chunks = r.iter_content(chunk_size=None, decode_unicode=True) Row = None for row in rows_from_chunks(chunks): # update description if self.description is None: self.description = get_description_from_row(row) # return row in namedtuple if Row is None: Row = namedtuple('Row', row.keys(), rename=True) yield Row(*row.values())
def _stream_query(self, query): """ Stream rows from a query. This method will yield rows as the data is returned in chunks from the server. """ self.description = None headers = {"Content-Type": "application/json"} payload = { "query": query, "context": self.context, "header": self.header } auth = (requests.auth.HTTPBasicAuth(self.user, self.password) if self.user else None) r = requests.post( self.url, stream=True, headers=headers, json=payload, auth=auth, verify=self.ssl_verify_cert, cert=self.ssl_client_cert, proxies=self.proxies, ) if r.encoding is None: r.encoding = "utf-8" # raise any error messages if r.status_code != 200: try: payload = r.json() except Exception: payload = { "error": "Unknown error", "errorClass": "Unknown", "errorMessage": r.text, } msg = "{error} ({errorClass}): {errorMessage}".format(**payload) raise exceptions.ProgrammingError(msg) # Druid will stream the data in chunks of 8k bytes, splitting the JSON # between them; setting `chunk_size` to `None` makes it use the server # size chunks = r.iter_content(chunk_size=None, decode_unicode=True) Row = None for row in rows_from_chunks(chunks): # update description if self.description is None: self.description = (list(row.items()) if self.header else get_description_from_row(row)) # return row in namedtuple if Row is None: Row = namedtuple("Row", row.keys(), rename=True) yield Row(*row.values())