개발

AWS Athena를 통해 S3 parquet 데이터 조회 (C#)

yun000 2025. 3. 21. 16:36

목적

대용량 데이터를 S3에 parquet 파일로 저장 후

Athena를 활용하여 C#프로그램에서 데이터를 조회해 보자

 

선행 과정

S3에 parquet 파일 저장후 Athena로 데이터 조회 해보기

https://yun000.tistory.com/295

 

S3에 Parquet 파일 올리고 Athena로 조회

1️⃣ AWS S3 bucket 생성AWS console의 S3에 접속 bucket 생성 bucket 이름과 지역 설정 후 하단의 create bucket 2️⃣ IAM 계정 만들기현재 Root계정이라면 IAM계정을 먼저 만들자Root 사용자는 AWS 계정 전체를

yun000.tistory.com

 

코드

NuGet 패키지 설치

dotnet add package AWSSDK.Athena

 

C# 코드

using System;
using System.Threading.Tasks;
using Amazon.Athena;
using Amazon.Athena.Model;

class Program
{
    static async Task Main(string[] args)
    {
        await AthenaQueryExample.RunQuery();
    }
}

class AthenaQueryExample
{
    private static string database = "Athena데이터베이스이름";
    private static string outputS3 = "s3://버켓명/경로/"; // 쿼리 결과 저장 위치. S3에 해당 폴더, 경로가 있는지 확인할 것것
    private static string query = "SELECT * FROM 테이블명";//조회할 쿼리문

    public static async Task RunQuery()
    {
        var client = new AmazonAthenaClient();

        var request = new StartQueryExecutionRequest
        {
            QueryString = query,
            QueryExecutionContext = new QueryExecutionContext { Database = database },
            ResultConfiguration = new ResultConfiguration { OutputLocation = outputS3 }
        };

        var response = await client.StartQueryExecutionAsync(request);
        string queryExecutionId = response.QueryExecutionId;

        // 쿼리 상태 확인
        GetQueryExecutionResponse result;
        do
        {
            await Task.Delay(1000);
            result = await client.GetQueryExecutionAsync(new GetQueryExecutionRequest
            {
                QueryExecutionId = queryExecutionId
            });
        } while (result.QueryExecution.Status.State == "RUNNING");

        if (result.QueryExecution.Status.State == "SUCCEEDED")
        {
            Console.WriteLine("쿼리 성공!!!!!!!!!");

            var resultsResponse = await client.GetQueryResultsAsync(new GetQueryResultsRequest
            {
                QueryExecutionId = queryExecutionId
            });

            foreach (var row in resultsResponse.ResultSet.Rows)
            {
                foreach (var data in row.Data)
                {
                    Console.Write($"{data.VarCharValue}\t");
                }
                Console.WriteLine();
            }
        }
        else
        {
            Console.WriteLine($"쿼리 실패... = {result.QueryExecution.Status.State} - {result.QueryExecution.Status.StateChangeReason}");
        }
    }
}