[RUBY]루비로 AWS Athena 사용하기
Gem
aws-sdk gem 안에 athena 서비스를 사용할 수 있는 함수도 포함되어 있다.
함수 사용하는 방법
처음에 aws-sdk를 사용할 때는, 아테나에 쿼리를 보내면 바로 결과값을 리턴해주는 기능이 있을거라고 기대했다.
마치 jdbc를 사용하듯이 사용할 수 있을줄 알았다. 그런데 약간 개념이 달랐다.
참고링크 : ATHENA RUBY SDK 사용법
이렇게 클라이언트를 만들고
client = Aws::Athena::Client.new(region: 'us-east-1')
resp = client.start_query_execution({
query_string: "SELECT * FROM impressions WHERE year='2017'", # required
query_execution_context: {
database: "sampledb",
},
result_configuration: { # required
output_location: "s3n://aws-athena-query-result-region/" # 쿼리 결과가 csv으로 저장되는 S3 경로
},
})
아래의 함수를 호출하면, 쿼리의 결과를 가져올 수 있다.
resp = client.get_query_results({
query_execution_id: resp.query_execution_id
})
AWS Athena를 서비스에 적용할 때, 주의사항
동시에 날릴 수 있는 쿼리의 갯수에 제한이 있다.
SELECT 쿼리문은 동시에 5개까지만 날릴 수 있다. ( 참고 링크 : Athena Service Limit )
갯수 제한은 늘릴 수 있기 때문에, AWS에 따로 요청해야한다.
한번에 가져올 수 있는 데이터 로우 갯수에 제한이 있다.
get_query_result 함수를 사용하면, 최대 1000개의 로우만 읽어올 수 있다.
결과 값의 크기가 1000개보다 많은 경우,
get_query_results 함수를 여러번 호출해서 전체 데이터를 읽어들여야한다.
쿼리 실행이 완전히 끝나기 전에, 결과값을 가져오는 함수를 호출하면 에러가 난다
때문에 데이터를 조회하기 전에, 쿼리 실행이 정상적으로 완료되었는지 확인해줘야한다.
resp = client.get_query_execution({
query_execution_id: resp.query_execution_id, # required
})
p
resp.query_execution.status.state #=> String, one of "QUEUED", "RUNNING", "SUCCEEDED", "FAILED", "CANCELLED"
쿼리의 상태를 조회했을 때, SUCCEEDED가 나와야 데이터의 결과값을 가져올 수 있다.
AWS Athena Ruby SDK 사용 후기
AWS Ruby sdk의 아테나 기능은 아쉬운 점이 꽤 많다.
쿼리 결과를 가져오기 위한 과정이 너무 복잡하다.
아테나 클라이언트를 생성하고, 쿼리문을 날리고, 쿼리 실행 결과를 확인해서, 1000건씩 데이터를 쪼개서 가져와야 한다.
게다가 이 데이터의 구조도 바로 사용하기에는 불편하게 되어있다.
< 끝 >