Buat dan terapkan menggunakan UDF Lambda - Amazon Athena

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Buat dan terapkan menggunakan UDF Lambda

Untuk membuat kustomUDF, Anda membuat kelas Java baru dengan memperluas UserDefinedFunctionHandler kelas. Kode sumber untuk UserDefinedFunctionHandler.java di SDK tersedia GitHub di athena-federation-sdk repositori awslabs/aws-athena-query-federation/, bersama dengan contoh UDF implementasi yang dapat Anda periksa dan modifikasi untuk membuat kustom. UDF

Langkah-langkah di bagian ini menunjukkan penulisan dan pembuatan file UDF Jar kustom menggunakan Apache Maven dari baris perintah dan penerapan.

Lakukan langkah-langkah berikut untuk membuat kustom UDF untuk Athena menggunakan Maven

Kloning SDK dan persiapkan lingkungan pengembangan Anda

Sebelum memulai, pastikan bahwa git diinstal pada sistem Anda menggunakansudo yum install git -y.

Untuk menginstal federasi AWS kueri SDK
  • Masukkan yang berikut ini di baris perintah untuk mengkloning SDK repositori. Repositori ini mencakupSDK, contoh dan rangkaian konektor sumber data. Untuk informasi selengkapnya tentang konektor sumber data, lihat Gunakan Kueri Federasi Amazon Athena.

    git clone https://github.com/awslabs/aws-athena-query-federation.git
Untuk menginstal prasyarat untuk prosedur ini

Jika Anda sedang mengerjakan mesin pengembangan yang sudah memiliki Apache Maven, the AWS CLI, dan alat AWS Serverless Application Model build yang diinstal, Anda dapat melewati langkah ini.

  1. Dari akaraws-athena-query-federationdirektori yang Anda buat saat Anda kloning, jalankanprepare_dev_env.shyang mempersiapkan lingkungan pengembangan Anda.

  2. Perbarui shell Anda untuk sumber variabel baru yang dibuat oleh proses instalasi atau restart sesi terminal Anda.

    source ~/.profile
    penting

    Jika Anda melewati langkah ini, Anda akan mendapatkan kesalahan nanti tentang AWS CLI atau AWS SAM membangun alat yang tidak dapat mempublikasikan fungsi Lambda Anda.

Buat proyek Maven Anda

Jalankan perintah berikut untuk membuat proyek Maven Anda. Ganti groupId dengan ID unik organisasi Anda, dan ganti my-athena-udf dengan nama aplikasi Anda Untuk informasi lebih lanjut, lihat Bagaimana cara membuat proyek Maven pertama saya? dalam dokumentasi Apache Maven.

mvn -B archetype:generate \ -DarchetypeGroupId=org.apache.maven.archetypes \ -DgroupId=groupId \ -DartifactId=my-athena-udfs

Tambahkan dependensi dan plugin ke proyek Maven Anda

Tambahkan konfigurasi berikut ke file proyek Maven pom.xml Anda. Sebagai contoh, lihat file pom.xml di file GitHub.

<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>

Tulis kode Java untuk UDFs

Buat kelas baru dengan memperluas UserDefinedFunctionHandler.java. Tulis Anda UDFs di dalam kelas.

Dalam contoh berikut, dua metode Java untukUDFs, compress() dandecompress(), dibuat di dalam kelasMyUserDefinedFunctions.

*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); } }

Membangun JAR file

Jalankanmvn clean installuntuk membangun proyek Anda. Setelah berhasil dibangun, JAR file dibuat di target folder proyek Anda bernamaartifactId-version.jar, di mana artifactId adalah nama yang Anda berikan dalam proyek Maven, misalnya,. my-athena-udfs

Menyebarkan ke JAR AWS Lambda

Anda memiliki dua pilihan untuk men-deploy kode Anda untuk Lambda:

  • Menyebarkan Menggunakan AWS Serverless Application Repository (Disarankan)

  • Buat Fungsi Lambda dari file JAR

Opsi 1: Menyebarkan ke AWS Serverless Application Repository

Ketika Anda menyebarkan JAR file Anda ke AWS Serverless Application Repository, Anda membuat YAML file AWS SAM template yang mewakili arsitektur aplikasi Anda. Anda kemudian menentukan YAML file ini dan bucket Amazon S3 tempat artefak untuk aplikasi Anda diunggah dan tersedia untuk file. AWS Serverless Application Repository Prosedur di bawah ini menggunakan skrip publish.sh yang terletak di athena-query-federation/tools direktori Athena Query Federation SDK yang Anda kloning sebelumnya.

Untuk informasi dan persyaratan selengkapnya, lihat Menerbitkan aplikasi di Panduan AWS Serverless Application Repository Pengembang, konsep AWS SAM templat di Panduan AWS Serverless Application Model Pengembang, dan Menerbitkan aplikasi tanpa server menggunakan. AWS SAM CLI

Contoh berikut menunjukkan parameter dalam YAML file. Tambahkan parameter serupa ke YAML file Anda dan simpan di direktori proyek Anda. Lihat athena-udf.yaml untuk contoh lengkapnya. GitHub

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

Salin publish.sh skrip ke direktori proyek tempat Anda menyimpan YAML file Anda, dan jalankan perintah berikut:

./publish.sh MyS3Location MyYamlFile

Misalnya, jika lokasi bucket Anda s3://amzn-s3-demo-bucket/mysarapps/athenaudf dan YAML file Anda disimpan sebagaimy-athena-udfs.yaml:

./publish.sh amzn-s3-demo-bucket/mysarapps/athenaudf my-athena-udfs
Untuk membuat fungsi Lambda
  1. Buka konsol Lambda di https://console.aws.amazon.com/lambda/, pilih Create function, lalu pilih Browse serverless app repository

  2. PilihAplikasi privat, temukan aplikasi Anda dalam daftar, atau cari menggunakan kata-kata kunci, dan pilih.

  3. Tinjau dan berikan detail aplikasi, lalu pilihTerapkan.

    Anda sekarang dapat menggunakan nama metode yang ditentukan dalam JAR file fungsi Lambda Anda seperti di UDFs Athena.

Opsi 2: Buat fungsi Lambda secara langsung

Anda juga dapat membuat fungsi Lambda secara langsung menggunakan konsol atau. AWS CLI Contoh berikut menunjukkan menggunakan perintah create-function CLI Lambda.

aws lambda create-function \ --function-name MyLambdaFunctionName \ --runtime java8 \ --role arn:aws:iam::1234567890123:role/my_lambda_role \ --handler com.mycompany.athena.udfs.MyUserDefinedFunctions \ --timeout 900 \ --zip-file fileb://./target/my-athena-udfs-1.0-SNAPSHOT.jar