Étape 2 : Création d'une table - Amazon Athena

Étape 2 : Création d'une table

Maintenant que vous avez une base de données, vous pouvez créer une table Athena pour celle-ci. La table que vous créez sera basée sur des exemples de données de journal Amazon CloudFront dans l'emplacement s3://athena-examples-myregion/cloudfront/plaintext/, où myregion est votre Région AWS actuelle.

Les données de l'exemple de journal sont au format TSV (valeurs séparées par des tabulations), ce qui signifie qu'un caractère de tabulation est utilisé comme délimiteur pour séparer les champs. Les données ressemblent à l'exemple suivant. Pour plus de lisibilité, les onglets de l'extrait ont été convertis en espaces et le champ final a été raccourci.

2014-07-05 20:00:09 DFW3 4260 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-1.jpeg 200 - Mozilla/5.0[...] 2014-07-05 20:00:09 DFW3 4252 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-2.jpeg 200 - Mozilla/5.0[...] 2014-07-05 20:00:10 AMS1 4261 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-3.jpeg 200 - Mozilla/5.0[...]

Pour permettre à Athena de lire ces données, vous pouvez créer une instruction CREATE EXTERNAL TABLE simple comme celle présentée ci-dessous. L'instruction qui crée la table définit les colonnes qui correspondent aux données, spécifie comment les données sont délimitées et spécifie l'emplacement Simple Storage Service (Amazon S3) qui contient les exemples de données. Notez que comme Athena s’attend à analyser tous les fichiers d’un dossier, la clause LOCATION spécifie un emplacement de dossier Amazon S3, et non un fichier spécifique.

N’utilisez pas cet exemple pour l’instant, car il comporte une limitation importante qui sera expliquée peu après.

CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_logs ( `Date` DATE, Time STRING, Location STRING, Bytes INT, RequestIP STRING, Method STRING, Host STRING, Uri STRING, Status INT, Referrer STRING, ClientInfo STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://athena-examples-my-region/cloudfront/plaintext/';

L'exemple crée une table appelée cloudfront_logs et spécifie un nom et un type de données pour chaque champ. Ces champs deviennent les colonnes de la table. Comme date est un mot réservé, il est échappé avec des guillemets simples inversés (`). ROW FORMAT DELIMITED signifie qu'Athena utilisera une bibliothèque par défaut appelée LazySimpleSerDe pour analyser les données. L'exemple spécifie également que les champs sont séparés par des tabulations (FIELDS TERMINATED BY '\t') et que chaque registre dans le fichier se termine par un saut de ligne (LINES TERMINATED BY '\n). Enfin, la clause LOCATION indique le chemin d'accès dans Simple Storage Service (Amazon S3) où se trouvent les données à lire.

Si vous disposez de vos propres données séparées par des tabulations ou des virgules, vous pouvez utiliser une instruction CREATE TABLE telle que celle figurant dans l’exemple qui vient d’être présenté (sous réserve que vos champs ne contiennent pas d’informations imbriquées). Toutefois, si vous disposez d’une colonne telle que ClientInfo et que celle-ci contient des informations imbriquées qui utilisent un séparateur différent, une approche différente est requise.

Extraction de données du champ ClientInfo

Concernant l’exemple de données, voici un exemple complet du champ final ClientInfo :

Mozilla/5.0%20(Android;%20U;%20Windows%20NT%205.1;%20en-US;%20rv:1.9.0.9)%20Gecko/2009040821%20IE/3.0.9

Comme vous pouvez le voir, ce champ est à valeurs multiples. Étant donné que l’exemple d’instruction CREATE TABLE qui vient d’être présenté spécifie des tabulations en tant que délimiteurs de champ, il ne peut pas répartir les différents composants du champ ClientInfo dans des colonnes distinctes. Une nouvelle instruction CREATE TABLE est donc requise.

Pour créer des colonnes à partir des valeurs du champ ClientInfo, vous pouvez utiliser une expression régulière (regex) qui contient des groupes de regex. Les groupes de regex que vous spécifiez deviennent des colonnes de table distinctes. Pour utiliser une regex dans votre instruction CREATE TABLE, utilisez une syntaxe comme la suivante. Cette syntaxe indique à Athena d'utiliser la bibliothèque SerDe Regex et l'expression rationnelle que vous spécifiez.

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ("input.regex" = "regular_expression")

Les expressions rationnelles peuvent être utiles pour créer des tables à partir de données CSV ou TSV complexes, mais elles peuvent être difficiles à écrire et à gérer. Heureusement, il existe d'autres bibliothèques que vous pouvez utiliser pour des formats tels que JSON, Parquet et ORC. Pour de plus amples informations, consultez Choix d’un SerDe pour vos données.

Vous êtes maintenant prêt à créer la table dans l'éditeur de requête Athena. L'instruction CREATE TABLE et la regex sont fournies pour vous.

Pour créer une table dans Athena
  1. Dans le panneau de navigation, pour Database (Base de données), assurez-vous que mydatabase est sélectionnée.

  2. Pour vous donner plus d'espace dans l'éditeur de requêtes, vous pouvez choisir l'icône de flèche pour réduire le panneau de navigation.

    Choisissez la flèche pour réduire le panneau de navigation.
  3. Pour créer un onglet pour une nouvelle requète, choisissez le signe plus (+) dans l'éditeur de requête. Vous pouvez ouvrir jusqu'à dix onglets de requête à la fois.

    Sélection de l'icône plus pour créer une nouvelle requête.
  4. Pour fermer un ou plusieurs onglets de requête, choisissez la flèche à côté du signe plus. Pour fermer tous les onglets en même temps, choisissez la flèche, puis choisissez Close all tabs (Fermer tous les onglets).

    Choisissez l'icône en forme de flèche pour fermer un ou plusieurs onglets de requête.
  5. Dans le volet de requête, saisissez l'instruction CREATE EXTERNAL TABLE suivante. La regex extrait les informations relatives au système d'exploitation, au navigateur et à la version du navigateur du champ ClientInfo des données du journal.

    Note

    L’expression régulière utilisée dans l’exemple suivant est conçue pour fonctionner avec les exemples de données de journal CloudFront accessibles au public dans l’emplacement Amazon S3 athena-examples et n’est fournie qu’à titre indicatif. Pour disposer d’expressions régulières plus récentes qui interrogent les fichiers journaux CloudFront standard et en temps réel, consultez Interrogation des journaux Amazon CloudFront.

    CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_logs ( `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/';
  6. Dans l'instruction LOCATION, remplacez myregion par la Région AWS que vous utilisez actuellement (par exemple, us-west-1).

  7. Cliquez sur Run (Exécuter).

    La table cloudfront_logs est créée et apparaît sous la liste Tables pour la base de données mydatabase.