Amazon Athena를 사용하면 JSON 인코딩된 데이터를 쿼리하고 중첩된 JSON에서 데이터를 추출하고, 값을 검색하고, JSON 어레이의 길이와 크기를 찾을 수 있습니다. Athena에서 JSON 데이터를 쿼리하는 방법에 대한 기본 정보를 알아보려면 다음 샘플 행성 데이터를 고려해 보세요.
{name:"Mercury",distanceFromSun:0.39,orbitalPeriod:0.24,dayLength:58.65} {name:"Venus",distanceFromSun:0.72,orbitalPeriod:0.62,dayLength:243.02} {name:"Earth",distanceFromSun:1.00,orbitalPeriod:1.00,dayLength:1.00} {name:"Mars",distanceFromSun:1.52,orbitalPeriod:1.88,dayLength:1.03}
각 레코드(기본적으로 테이블의 각 행)가 어떻게 별도의 줄에 있는지 확인하세요. JSON 데이터를 쿼리하려면 다음과 같은 간단한 CREATE TABLE
문을 사용할 수 있습니다.
CREATE EXTERNAL TABLE `planets_json`(
`name` string,
`distancefromsun` double,
`orbitalperiod` double,
`daylength` double)
ROW FORMAT SERDE
'org.openx.data.jsonserde.JsonSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
's3://amzn-s3-demo-bucket/json/'
데이터를 쿼리하려면 다음 예제와 같은 간단한 SELECT
문을 사용할 수 있습니다.
SELECT * FROM planets_json
쿼리 결과는 다음과 같이 나타납니다.
# | name | distancefromsun | orbitalperiod | daylength |
---|---|---|---|---|
1 | 수성 | 0.39 | 0.24 | 58.65 |
2 | 금성 | 0.72 | 0.62 | 243.02 |
3 | 지구 | 1.0 | 1.0 | 1.0 |
4 | 화성 | 1.52 | 1.88 | 1.03 |
CREATE TABLE
문에서 각 JSON 레코드가 별도의 줄에 있을 것을 요구하는 OpenX JSON SerDe를 어떻게 사용하는지 확인하세요. JSON이 예쁜 인쇄 형식으로 되어 있거나 모든 레코드가 한 줄에 있는 경우 데이터를 제대로 읽을 수 없습니다.
예쁜 인쇄 형식의 JSON 데이터를 쿼리하려면 OpenX JSON SerDe 대신 Amazon Ion Hive SerDe를 사용할 수 있습니다. 이전 데이터가 예쁜 인쇄 형식으로 저장되어 있다고 가정해 보겠습니다.
{
name:"Mercury",
distanceFromSun:0.39,
orbitalPeriod:0.24,
dayLength:58.65
}
{
name:"Venus",
distanceFromSun:0.72,
orbitalPeriod:0.62,
dayLength:243.02
}
{
name:"Earth",
distanceFromSun:1.00,
orbitalPeriod:1.00,
dayLength:1.00
}
{
name:"Mars",
distanceFromSun:1.52,
orbitalPeriod:1.88,
dayLength:1.03
}
형식을 다시 지정하지 않고 이 데이터를 쿼리하려면 다음과 같은 CREATE TABLE
문을 사용할 수 있습니다. 이 문은 OpenX JSON SerDe를 지정하는 대신 STORED AS ION
을 지정하는 것을 볼 수 있습니다.
CREATE EXTERNAL TABLE `planets_ion`(
`name` string,
`distancefromsun` DECIMAL(10, 2),
`orbitalperiod` DECIMAL(10, 2),
`daylength` DECIMAL(10, 2))
STORED AS ION
LOCATION
's3://amzn-s3-demo-bucket/json-ion/'
쿼리 SELECT * FROM planets_ion
은 이전과 동일한 결과를 생성합니다. Amazon Ion Hive Serde를 사용하여 이러한 방식으로 테이블을 생성하는 방법에 대한 자세한 내용은 Amazon Ion 테이블 생성 섹션을 참조하세요.
위의 예제 JSON 데이터에는 중첩된 배열 또는 구조체와 같은 복잡한 데이터 유형이 포함되어 있지 않습니다. 중첩된 JSON 데이터의 쿼리에 대한 자세한 내용은 예제: 중첩 JSON 역직렬화 섹션을 참조하세요.