Что такое Амазонка Афина?

Amazon Athena предоставляет платформу, которую мы можем использовать для стандартных запросов SQL, и она использует Amazon Simple Storage (S3) для хранения данных.

Почему мы должны использовать Афину?

  • Athena является бессерверной, и в ней нет инфраструктуры для настройки и управления.
  • Платите только за запросы, которые мы выполняем.
  • Запросы выполняются быстрее даже с большим набором данных.
  • Параллельный запрос делает систему быстрее.
  • Перетащите базу данных NoSql на S3 и используйте Amazon Athena для анализа данных непосредственно из S3.

Шаги по использованию Amazon Athena -

Шаг 1. Создайте базу данных

Сначала вам нужно создать базу данных в Афине. Для создания базы данных -

i) Откройте консоль Athena.

ii) В редакторе запросов Athena вы видите панель запроса с примером запроса. Начните вводить запрос в любом месте панели запросов. Чтобы создать базу данных с именем testdatabase, введите следующий оператор CREATE DATABASE, а затем выберите Run Query:

CREATE DATABASE testdatabase

Шаг 2. Создайте таблицу

i) Убедитесь, что для БАЗЫ ДАННЫХ выбрана база тестовых данных, а затем выберите «Новый запрос».

ii) На панели запроса введите следующий оператор CREATE TABLE, а затем выберите «Выполнить запрос»:

CREATE EXTERNAL TABLE IF NOT EXISTS test_table(
`Date` DATE,
 Time STRING,
 Location STRING,
 Bytes INT,
 RequestIP STRING,
 Method STRING,
 Host STRING,
 Uri STRING,
 Status INT,
 Referrer STRING,
 os STRING,
 Browser STRING,
BrowserVersion STRING
) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "^(?!#)([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^
 ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+[^\(]+[\(]
([^\;]+).*\%20([^\/]+)[\/](.*)$") LOCATION 's3://athena-examples-
myregion/cloudfront/plaintext/';

Измените путь к местоположению S3, где вы храните свои данные.

Шаг 3. Запрос данных в nodejs

i) Создать идентификатор выполнения запроса

function createQueryExecutionId(){
/** doing resultConfiguration, but we will not save query result there. */
   const params = {
     QueryString: 'Select * From test-table', /* required */
     ResultConfiguration: { /* required */
     OutputLocation: `s3://bucket-name/`, 
    /* required s3 output location path*/
    EncryptionConfiguration: {
      EncryptionOption: 'SSE_S3', /* required */
    }
  }
};
athena.startQueryExecution(params, (err, data) => {
   console.log(err, data);
});
}

ii) Проверьте статус созданного идентификатора выполнения запроса на последнем шаге.

function checkQueryCreateStatus(){
   const params = {
      QueryExecutionId: this.QueryExecutionId 
      /* required generated in last step*/
   };
   athena.getQueryExecution(params, (err, data) => {
     if (err) {
      console.log(err, err.stack); // an error occurred
     }
     else{
        if(data && data.QueryExecution && data.QueryExecution.Status &&
 data.QueryExecution.Status.State && data.QueryExecution.Status.State === 
'RUNNING'){
             console.log("Athena Query status is running");
          }
          else{
            console.log("Atehna Query status is Active");
          }
     }
   });
}

iii) Получить результат запроса, когда статус запроса Athena активен.

function getQueryResultByExecutionId(queryExecutionId){
    const params = {
      QueryExecutionId: queryExecutionId
      /*queryExecutionId created in first step.*/
    };
    athena.getQueryResults(params, (err, data) => {
       console.log(err?err.stack:err, data);
     });
}

iv) Остановить идентификатор выполнения запроса Athena

function stopQueryExecutionId(queryExecutionId){
    const params = {
       QueryExecutionId: queryExecutionId
    };
    athena.stopQueryExecution(params, (err, data) => {
      console.log(err?err.stack:err, data);
    });
}

Не стесняйтесь загрузить полный код этого сообщения, чтобы увидеть полную картину того, как все работает вместе, и настроить его для своих нужд. Загляните в репозиторий, чтобы увидеть полный рабочий код. Исходный код на гитхабе.