Почему Пятена не работает над более длинными запросами, в то время как Афина их выполняет? - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть запрос, который выполняется в Афине (напрямую) за 43 секунды при сканировании данных объемом 90 ГБ. Затем я использую pyathena для выполнения того же запроса (я использую его в блокноте jupyter на EMR), и он просто не завершает работу (и никогда не возвращает никаких результатов). Я проверил его для небольших запросов (установив лимит 100), и он работает. Есть ли какая-то причина, почему pyathena намного медленнее, чем выполнение запросов непосредственно в Athena?

1 Ответ

0 голосов
/ 15 ноября 2018

Полагаю, вы используете API fetchall.

Метод fetchall использует fetchone до тех пор, пока больше не будет результатов, и поэтому он занимает так много времени.

def fetchall(self):
    rows = []
    while True:
        row = self.fetchone()
        if row:
            rows.append(row)
        else:
            break
    return rows

Вы можете использовать cursor.output_location, чтобы получить файл результатов csv, который Athena создает для чтения результатов (например, с помощью boto3):

bucket, key = cursor.output_location.strip('s3://').split('/', 1)
session = boto3.session.Session(aws_access_key_id=YOUR_AWS_KEY, aws_secret_access_key=YOUR_AWS_SECRET, region_name=YOUR_REGION_NAME)

result = session.resource('s3').Object(bucket, key)

Кроме того, в следующих версиях pyathena вы сможете читать результаты в pandas dataframe, используя as_pandas api, который читает файл из s3.

...