3.5. S3 Select operations
개발자는 S3 select를 실행하여 처리량을 가속화할 수 있습니다. 사용자는 중재자 없이 S3 선택 쿼리를 직접 실행할 수 있습니다.
CSV, Apache Parquet (Parquet) 및 JSON 오브젝트에 CSV, Parquet 및 JSON 오브젝트와 함께 S3 선택 작업을 제공하는 JSON의 세 가지 S3 선택 워크플로우가 있습니다.
- CSV 파일은 테이블 형식 데이터를 일반 텍스트 형식으로 저장합니다. 파일의 각 행은 데이터 레코드입니다.
- parquet는 효율적인 데이터 저장 및 검색을 위해 설계된 오픈 소스 열 중심 데이터 파일 형식입니다. 매우 효율적인 데이터 압축 및 인코딩 체계를 제공하여 복잡한 데이터를 대량으로 처리할 수 있는 향상된 성능을 제공합니다. parquet를 사용하면 S3 select-engine이 열과 청크를 건너뛸 수 있으므로 IOPS를 크게 줄일 수 있습니다(CSV 및 JSON 형식 비교).
- JSON은 형식 구조입니다. S3 선택 엔진을 사용하면 JSON 리더를 사용하여 JSON 형식 입력 데이터 상단에 SQL 문을 사용할 수 있으므로 매우 중첩되고 복잡한 JSON 형식의 데이터를 스캔할 수 있습니다.
예를 들어 CSV, Parquet 또는 JSON S3 개체가 여러 기가바이트의 데이터를 사용하여 사용자는 다음 쿼리를 사용하여 다른 열로 필터링되는 단일 열을 추출할 수 있습니다.
예
select customerid from s3Object where age>30 and age<65;
현재 S3 오브젝트는 데이터를 필터링하고 추출하기 전에 Ceph Object Gateway를 통해 Ceph OSD에서 데이터를 검색해야 합니다. 개체가 크고 쿼리가 더 구체적인 경우 성능이 향상됩니다. Parquet 형식은 CSV보다 더 효율적으로 처리할 수 있습니다.
사전 요구 사항
- 실행 중인 Red Hat Ceph Storage 클러스터.
- RESTful 클라이언트입니다.
- 사용자 액세스 권한이 있는 S3 사용자
3.5.1. S3 오브젝트에서 콘텐츠 선택 링크 복사링크가 클립보드에 복사되었습니다!
select 오브젝트 콘텐츠 API는 구조화된 쿼리 언어(SQL)를 통해 오브젝트 콘텐츠를 필터링합니다. 인벤토리 오브젝트에 상주해야 하는 사항에 대한 설명의 예는 AWS Systems Manager 사용자 가이드 의 인벤토리에서 수집한 메타데이터 섹션을 참조하십시오. 인벤토리 콘텐츠는 해당 인벤토리에 대해 실행해야 하는 쿼리 유형에 영향을 미칩니다. 필수 정보를 제공할 수 있는 SQL 문의 수는 크지만 S3 select는 SQL과 같은 유틸리티이므로 그룹별 및 조인 과 같이 일부 연산자는 지원되지 않습니다.
CSV에만 대해 지정된 콘텐츠를 검색하려면 개체의 쉼표로 구분된 값으로 데이터 직렬화 형식을 지정해야 합니다. parquet는 바이너리 형식이므로 구분 기호가 없습니다. AWS(Amazon Web Services) CLI(명령줄 인터페이스) 선택 오브젝트 콘텐츠는 CSV 또는 Parquet 형식을 사용하여 오브젝트 데이터를 레코드로 구문 분석하고 쿼리에 지정된 레코드만 반환합니다.
응답에 대한 데이터 직렬화 형식을 지정해야 합니다. 이 작업에 대한 s3:GetObject 권한이 있어야 합니다.
-
InputSerialization요소는 쿼리되는 개체의 데이터 형식을 설명합니다. 오브젝트는 CSV 또는 Parquet 형식일 수 있습니다. -
OutputSerialization요소는 AWS-CLI 사용자 클라이언트의 일부이며 출력 데이터의 포맷 방법을 설명합니다. Ceph는 AWS-CLI에 대한 서버 클라이언트를 구현했기 때문에 현재 CSV만 있는OutputSerialization에 따라 동일한 출력을 제공합니다. -
InputSerialization형식은OutputSerialization의 형식과 일치시킬 필요가 없습니다. 예를 들어OutputSerialization의InputSerialization및 CSV에서 Parquet를 지정할 수 있습니다.
구문
POST /BUCKET/KEY?select&select-type=2 HTTP/1.1\r\n
예
POST /testbucket/sample1csv?select&select-type=2 HTTP/1.1\r\n
POST /testbucket/sample1parquet?select&select-type=2 HTTP/1.1\r\n
| 요청 | 설명 | 유형 | 필수 항목 |
|---|---|---|---|
|
| 오브젝트 콘텐츠를 선택할 버킷입니다. | 문자열 | 제공됨 |
|
| 오브젝트 키입니다. 최소 길이는 1이어야 합니다. | 문자열 | 제공됨 |
|
| 선택한 오브젝트 콘텐츠 요청 매개변수의 root 수준 태그입니다. | 문자열 | 제공됨 |
|
| 오브젝트를 쿼리하는 데 사용되는 식입니다. | 문자열 | 제공됨 |
|
|
제공된 식의 유형입니다(예:
유효한 값: | 문자열 | 제공됨 |
|
| 쿼리되는 개체의 데이터 형식에 대해 설명합니다.Describes the format of the data in the object that is being queried. | 문자열 | 제공됨 |
|
| 쉼표 구분 기호 및 새 줄로 반환되는 데이터 형식입니다. | 문자열 | 제공됨 |
응답 엔티티
작업이 성공하면 서비스는 HTTP 200 응답을 보냅니다. 데이터는 서비스에서 XML 형식으로 반환됩니다.
| 요청 | 설명 | 유형 | 필수 항목 |
|---|---|---|---|
|
| 페이로드 매개 변수의 루트 수준 태그입니다. | 문자열 | 제공됨 |
|
| 레코드 이벤트입니다. | base64로 인코딩된 바이너리 데이터 오브젝트 | 없음 |
|
| 통계 이벤트입니다. | long | 없음 |
Ceph Object Gateway는 다음 응답 유형을 지원합니다.
예
{:event-type,records} {:content-type,application/octet-stream} {:message-type,event}
구문(CSV의 경우)
aws --endpoint-URL http://localhost:80 s3api select-object-content
--bucket BUCKET_NAME
--expression-type 'SQL'
--input-serialization
'{"CSV": {"FieldDelimiter": "," , "QuoteCharacter": "\"" , "RecordDelimiter" : "\n" , "QuoteEscapeCharacter" : "\\" , "FileHeaderInfo": "USE" }, "CompressionType": "NONE"}'
--output-serialization '{"CSV": {}}'
--key OBJECT_NAME.csv
--expression "select count(0) from s3object where int(_1)<10;" output.csv
예(CSV의 경우)
aws --endpoint-url http://localhost:80 s3api select-object-content
--bucket testbucket
--expression-type 'SQL'
--input-serialization
'{"CSV": {"FieldDelimiter": "," , "QuoteCharacter": "\"" , "RecordDelimiter" : "\n" , "QuoteEscapeCharacter" : "\\" , "FileHeaderInfo": "USE" }, "CompressionType": "NONE"}'
--output-serialization '{"CSV": {}}'
--key testobject.csv
--expression "select count(0) from s3object where int(_1)<10;" output.csv
구문(Parquet의 경우)
aws --endpoint-url http://localhost:80 s3api select-object-content
--bucket BUCKET_NAME
--expression-type 'SQL'
--input-serialization
'{"Parquet": {}, {"CompressionType": "NONE"}'
--output-serialization '{"CSV": {}}'
--key OBJECT_NAME.parquet
--expression "select count(0) from s3object where int(_1)<10;" output.csv
예: (Parquet)
aws --endpoint-url http://localhost:80 s3api select-object-content
--bucket testbucket
--expression-type 'SQL'
--input-serialization
'{"Parquet": {}, {"CompressionType": "NONE"}'
--output-serialization '{"CSV": {}}'
--key testobject.parquet
--expression "select count(0) from s3object where int(_1)<10;" output.csv
구문(JSON의 경우)
aws --endpoint-URL http://localhost:80 s3api select-object-content
--bucket BUCKET_NAME
--expression-type 'SQL'
--input-serialization
'{"JSON": {"CompressionType": "NONE"}'
--output-serialization '{"CSV": {}}}'
--key OBJECT_NAME.json
--expression "select count(0) from s3object where int(_1)<10;" output.csv
예(JSON의 경우)
aws --endpoint-url http://localhost:80 s3api select-object-content
--bucket testbucket
--expression-type 'SQL'
--input-serialization
'{"JSON": {"CompressionType": "NONE"}'
--output-serialization '{"CSV": {}}}'
--key testobject.json
--expression "select count(0) from s3object where int(_1)<10;" output.csv
예(boTO3)
import pprint
import boto3
from botocore.exceptions import ClientError
def run_s3select(bucket,key,query,column_delim=",",row_delim="\n",quot_char='"',esc_char='\\',csv_header_info="NONE"):
s3 = boto3.client('s3',
endpoint_url=endpoint,
aws_access_key_id=access_key,
region_name=region_name,
aws_secret_access_key=secret_key)
result = ""
try:
r = s3.select_object_content(
Bucket=bucket,
Key=key,
ExpressionType='SQL',
InputSerialization = {"CSV": {"RecordDelimiter" : row_delim, "FieldDelimiter" : column_delim,"QuoteEscapeCharacter": esc_char, "QuoteCharacter": quot_char, "FileHeaderInfo": csv_header_info}, "CompressionType": "NONE"},
OutputSerialization = {"CSV": {}},
Expression=query,
RequestProgress = {"Enabled": progress})
except ClientError as c:
result += str(c)
return result
for event in r['Payload']:
if 'Records' in event:
result = ""
records = event['Records']['Payload'].decode('utf-8')
result += records
if 'Progress' in event:
print("progress")
pprint.pprint(event['Progress'],width=1)
if 'Stats' in event:
print("Stats")
pprint.pprint(event['Stats'],width=1)
if 'End' in event:
print("End")
pprint.pprint(event['End'],width=1)
return result
run_s3select(
"my_bucket",
"my_csv_object",
"select int(_1) as a1, int(_2) as a2 , (a1+a2) as a3 from s3object where a3>100 and a3<300;")
지원되는 기능
현재 AWS s3 select 명령의 일부만 지원됩니다.