Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Pour créer une personnalisationUDF, vous devez créer une nouvelle classe Java en étendant la UserDefinedFunctionHandler
classe. Le code source du UserDefinedFunctionHandlerfichier .java
Les étapes décrites dans cette section montrent comment écrire et créer un fichier UDF Jar personnalisé à l'aide d'Apache Maven
Procédez comme suit pour créer une personnalisation UDF pour Athena à l'aide de Maven
Clonez SDK et préparez votre environnement de développement
Avant de commencer, assurez-vous que git est installé sur votre système en utilisant sudo
yum install git -y
.
Pour installer la fédération AWS de requêtes SDK
-
Entrez ce qui suit sur la ligne de commande pour cloner le SDK référentiel. Ce référentiel inclut des SDK exemples et une suite de connecteurs de sources de données. Pour de plus amples informations sur les connecteurs de source de données, veuillez consulter Utiliser la requête fédérée Amazon Athena.
git clone https://github.com/awslabs/aws-athena-query-federation.git
Pour installer les éléments requis pour cette procédure
Si vous travaillez sur une machine de développement sur laquelle Apache Maven, le AWS CLI, et l'outil de AWS Serverless Application Model compilation sont déjà installés, vous pouvez ignorer cette étape.
-
À partir de la racine du répertoire
aws-athena-query-federation
que vous avez créé lors du clonage, exécutez le script prepare_dev_env.shqui prépare votre environnement de développement. -
Mettez à jour votre shell pour obtenir les nouvelles variables créées par le processus d'installation ou redémarrez votre session de terminal.
source ~/.profile
Important
Si vous ignorez cette étape, vous recevrez ultérieurement des erreurs indiquant que l'outil AWS CLI ou l'outil de AWS SAM génération ne sera pas en mesure de publier votre fonction Lambda.
Créez votre projet Maven
Exécutez la commande suivante pour créer votre projet Maven. Remplacez groupId
par l'identifiant unique de votre organisation et remplacez my-athena-udf
par le nom de votre application. Pour plus d'informations, voir Comment créer mon premier projet Maven
mvn -B archetype:generate \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DgroupId=
groupId
\ -DartifactId=my-athena-udfs
Ajouter des dépendances et des plugins à votre projet Maven
Ajoutez les configurations suivantes au fichier pom.xml
du projet Maven. Pour un exemple, consultez le fichier pom.xml
<properties>
<aws-athena-federation-sdk.version>2022.47.1</aws-athena-federation-sdk.version>
</properties>
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-athena-federation-sdk</artifactId>
<version>${aws-athena-federation-sdk.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<createDependencyReducedPom>false</createDependencyReducedPom>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Écrivez du code Java pour UDFs
Créez une nouvelle classe en étendant le UserDefinedFunctionHandlerfichier .java.
Dans l'exemple suivant, deux méthodes Java pourUDFs, compress()
etdecompress()
, sont créées dans la classeMyUserDefinedFunctions
.
*package *com.mycompany.athena.udfs;
public class MyUserDefinedFunctions
extends UserDefinedFunctionHandler
{
private static final String SOURCE_TYPE = "MyCompany";
public MyUserDefinedFunctions()
{
super(SOURCE_TYPE);
}
/**
* Compresses a valid UTF-8 String using the zlib compression library.
* Encodes bytes with Base64 encoding scheme.
*
* @param input the String to be compressed
* @return the compressed String
*/
public String compress(String input)
{
byte[] inputBytes = input.getBytes(StandardCharsets.UTF_8);
// create compressor
Deflater compressor = new Deflater();
compressor.setInput(inputBytes);
compressor.finish();
// compress bytes to output stream
byte[] buffer = new byte[4096];
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(inputBytes.length);
while (!compressor.finished()) {
int bytes = compressor.deflate(buffer);
byteArrayOutputStream.write(buffer, 0, bytes);
}
try {
byteArrayOutputStream.close();
}
catch (IOException e) {
throw new RuntimeException("Failed to close ByteArrayOutputStream", e);
}
// return encoded string
byte[] compressedBytes = byteArrayOutputStream.toByteArray();
return Base64.getEncoder().encodeToString(compressedBytes);
}
/**
* Decompresses a valid String that has been compressed using the zlib compression library.
* Decodes bytes with Base64 decoding scheme.
*
* @param input the String to be decompressed
* @return the decompressed String
*/
public String decompress(String input)
{
byte[] inputBytes = Base64.getDecoder().decode((input));
// create decompressor
Inflater decompressor = new Inflater();
decompressor.setInput(inputBytes, 0, inputBytes.length);
// decompress bytes to output stream
byte[] buffer = new byte[4096];
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(inputBytes.length);
try {
while (!decompressor.finished()) {
int bytes = decompressor.inflate(buffer);
if (bytes == 0 && decompressor.needsInput()) {
throw new DataFormatException("Input is truncated");
}
byteArrayOutputStream.write(buffer, 0, bytes);
}
}
catch (DataFormatException e) {
throw new RuntimeException("Failed to decompress string", e);
}
try {
byteArrayOutputStream.close();
}
catch (IOException e) {
throw new RuntimeException("Failed to close ByteArrayOutputStream", e);
}
// return decoded string
byte[] decompressedBytes = byteArrayOutputStream.toByteArray();
return new String(decompressedBytes, StandardCharsets.UTF_8);
}
}
Construisez le JAR fichier
Exécutez mvn clean install
pour construire votre projet. Une fois la compilation réussie, un JAR fichier est créé dans le target
dossier de votre projet nommé
, où artifactId
-version
.jarartifactId
est le nom que vous avez fourni dans le projet Maven, par exemple,my-athena-udfs
.
Déployez le JAR vers AWS Lambda
Vous avez deux options pour déployer votre code sur Lambda :
-
Déployer à l'aide de AWS Serverless Application Repository (recommandé)
-
Création d'une fonction Lambda à partir du fichier JAR
Option 1 : Déployer sur AWS Serverless Application Repository
Lorsque vous déployez votre JAR fichier dans le AWS Serverless Application Repository, vous créez un YAML fichier AWS SAM modèle qui représente l'architecture de votre application. Vous spécifiez ensuite ce YAML fichier et un compartiment Amazon S3 dans lequel les artefacts de votre application sont téléchargés et mis à la disposition du AWS Serverless Application Repository. La procédure ci-dessous utilise le script publish.shathena-query-federation/tools
répertoire de l'Athena Query Federation SDK que vous avez cloné précédemment.
Pour plus d'informations et pour connaître les exigences, consultez les sections Publication d'applications dans le Guide du AWS Serverless Application Repository développeur, concepts de AWS SAM modèles dans le Guide du AWS Serverless Application Model développeur et Publication d'applications sans serveur à l'aide du AWS SAM CLI.
L'exemple suivant illustre les paramètres d'un YAML fichier. Ajoutez des paramètres similaires à votre YAML fichier et enregistrez-le dans le répertoire de votre projet. Voir athena-udf.yaml
Transform: 'AWS::Serverless-2016-10-31'
Metadata:
'AWS::ServerlessRepo::Application':
Name: MyApplicationName
Description: 'The description I write for my application
'
Author: 'Author Name
'
Labels:
- athena-federation
SemanticVersion: 1.0.0
Parameters:
LambdaFunctionName:
Description: 'The name of the Lambda function that will contain your UDFs.
'
Type: String
LambdaTimeout:
Description: 'Maximum Lambda invocation runtime in seconds. (min 1 - 900 max)'
Default: 900
Type: Number
LambdaMemory:
Description: 'Lambda memory in MB (min 128 - 3008 max).'
Default: 3008
Type: Number
Resources:
ConnectorConfig:
Type: 'AWS::Serverless::Function'
Properties:
FunctionName: !Ref LambdaFunctionName
Handler: "full.path.to.your.handler. For example, com.amazonaws.athena.connectors.udfs.MyUDFHandler
"
CodeUri: "Relative path to your JAR file. For example, ./target/athena-udfs-1.0.jar
"
Description: "My description of the UDFs that this Lambda function enables.
"
Runtime: java8
Timeout: !Ref LambdaTimeout
MemorySize: !Ref LambdaMemory
Copiez le publish.sh
script dans le répertoire du projet où vous avez enregistré votre YAML fichier, puis exécutez la commande suivante :
./publish.sh
MyS3Location
MyYamlFile
Par exemple, si l'emplacement de votre compartiment est s3://amzn-s3-demo-bucket/mysarapps/athenaudf
et que votre YAML fichier a été enregistré sous my-athena-udfs.yaml
:
./publish.sh amzn-s3-demo-bucket/mysarapps/athenaudf my-athena-udfs
Pour créer une fonction Lambda
-
Ouvrez la console Lambda à l'adresse https://console.aws.amazon.com/lambda/
, choisissez Create function, puis choisissez Parcourir le référentiel d'applications sans serveur -
Choisissez Private applications (Applications privées), recherchez votre application dans la liste ou recherchez-la en utilisant des mots clés, puis sélectionnez-la.
-
Vérifiez et fournissez les détails de l'application, puis choisissez Déployer.
Vous pouvez désormais utiliser les noms de méthodes définis dans votre JAR fichier de fonctions Lambda comme dans UDFs Athena.
Option 2 : créer directement une fonction Lambda
Vous pouvez également créer une fonction Lambda directement à l'aide de la console ou. AWS CLI L'exemple suivant illustre l'utilisation de la commande Lambda create-function
CLI.
aws lambda create-function \ --function-name
MyLambdaFunctionName
\ --runtime java8 \ --role arn:aws:iam::1234567890123:role/my_lambda_role
\ --handlercom.mycompany.athena.udfs.MyUserDefinedFunctions
\ --timeout 900 \ --zip-file fileb://./target/my-athena-udfs-1.0-SNAPSHOT.jar