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 의 형식과 일치시킬 필요가 없습니다. 예를 들어 OutputSerializationInputSerialization 및 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

Expand
표 3.4. 요청 엔티티
요청설명유형필수 항목

bucket

오브젝트 콘텐츠를 선택할 버킷입니다.

문자열

제공됨

오브젝트 키입니다.

최소 길이는 1이어야 합니다.

문자열

제공됨

SelectObjectContentRequest

선택한 오브젝트 콘텐츠 요청 매개변수의 root 수준 태그입니다.

문자열

제공됨

expression

오브젝트를 쿼리하는 데 사용되는 식입니다.

문자열

제공됨

ExpressionType

제공된 식의 유형입니다(예: SQL ).

유효한 값: SQL

문자열

제공됨

InputSerialization

쿼리되는 개체의 데이터 형식에 대해 설명합니다.Describes the format of the data in the object that is being queried.

문자열

제공됨

OutputSerialization

쉼표 구분 기호 및 새 줄로 반환되는 데이터 형식입니다.

문자열

제공됨

응답 엔티티

작업이 성공하면 서비스는 HTTP 200 응답을 보냅니다. 데이터는 서비스에서 XML 형식으로 반환됩니다.

Expand
요청설명유형필수 항목

페이로드

페이로드 매개 변수의 루트 수준 태그입니다.

문자열

제공됨

레코드

레코드 이벤트입니다.

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 명령의 일부만 지원됩니다.

Expand
기능세부 정보설명

연산 연산자

^ * % / + - ( )

해당 없음

s3object에서 (int(_1)+int(_2))*int(_9)를 선택합니다.

연산 연산자

% modulo

해당 없음

캐스팅(_1을 int로)%2 = 0인 s3 오브젝트에서 count(*)를 선택합니다.

연산 연산자

↑ Power-of

해당 없음

s3object에서 캐스팅(2^10 as int)을 선택합니다.

Operator 비교

> < >= ⇐ == !=

해당 없음

s3object에서 _1,_2를 선택합니다. 여기서 (int(_1)+int(_3))>int(_5);

논리 Operator

또는

해당 없음

s3object이 아닌 위치에서 count(*)를 선택합니다(정수(1)>123 및 int(_5)<200);

논리 Operator

null입니다.

표현식의 null 표시에 대해 true/false를 반환합니다.

해당 없음

논리 연산자 및 NULL

null이 아닙니다.

표현식의 null 표시에 대해 true/false를 반환합니다.

해당 없음

논리 연산자 및 NULL

알 수 없는 상태

null을 검토하고 NULL을 사용하여 논리 작업의 결과를 관찰합니다. 쿼리는 0 을 반환합니다.

s3 개체에서 null 및 (3>2)를 선택합니다.

NULL을 사용하는 연산 연산자

알 수 없는 상태

null을 검토하고 NULL을 사용하여 바이너리 작업의 결과를 관찰합니다. 쿼리는 0 을 반환합니다.

s3object where (null+1) 및 (3>2)에서 count(*)를 선택합니다.

NULL과 비교

알 수 없는 상태

null-handle을 검토하고 NULL을 사용한 비교 작업의 결과를 관찰합니다. 쿼리는 0 을 반환합니다.

s3object where (null*1.5) != 3에서 count(*)를 선택합니다.

누락된 열

알 수 없는 상태

해당 없음

s3object에서 count(*)를 선택합니다. 여기서 _1은 null입니다.

프로젝션 열

if 또는 그 이상과 유사합니다.

해당 없음

1+1== (2+1)*3인 경우 케이스를 선택한 후 'case_1'을 선택합니다. 4*3)===" then 'case_2' other 'case_else' end, age*2 from s3object;

프로젝션 열

전환/케이스 기본값과 유사합니다.

해당 없음

케이스 캐스팅(_1 as int) + 1 when 2 then "a" when 3 then "b" else "c" end from s3object;

논리 Operator

해당 없음

coalesce 는 null이 아닌 첫 번째 인수를 반환합니다.

s3object에서 coalesce(nullif(5,5),nullif(1,1.0),age+12)를 선택합니다.

논리 Operator

해당 없음

NULLIF는 두 인수가 모두 같거나 첫 번째 인수인 nullif (1,1)=NULL nullif(null,1)=NULL nullif(2,1)=2인 경우 null을 반환합니다.

s3object에서 nullif(cast(_1)를 int로),cast(_2 as int)를 선택합니다.

논리 Operator

해당 없음

{expression} in (.. {expression} ..)

'ben' in (trim(_5),substring(_1,char_length(_1)-3,3),last_name); s3object에서 count(*)를 선택합니다.

논리 Operator

해당 없음

{expression}과 {expression} 사이의 {expression}

800과 900 사이의 캐스팅(_1 as int)에서 _1을 선택합니다. 여기서 stdin(_3,char_length(_3),1) 간에 "x"와 트리트(_3,char_length(_3)-1,1) = ":" 사이의 count(_3,char_length(_3),1) 를 선택합니다.

논리 Operator

해당 없음

{match-pattern}과 같은 {expression}

'%de_'와 같은 s3object에서 count( )를 선택하고, s3object에서 count( )를 선택합니다. 여기서 _1은 "%a[r-s]와 같습니다.

캐스팅 Operator

해당 없음

해당 없음

s3object에서 cast(123 as int)%2를 선택합니다.

캐스팅 Operator

해당 없음

해당 없음

s3object에서 cast(123.456 as float)%2를 선택합니다.

캐스팅 Operator

해당 없음

해당 없음

s3object에서 cast('ABC0-9'를 문자열로),cast(substr('ab12cd',3,2)를 int)*4를 선택합니다.

캐스팅 Operator

해당 없음

해당 없음

s3object에서 cast( 2007-01-01',12,10)에서 cast(substring('publish on 2007-01-01',12,10))를 선택합니다.

AWS 캐스팅 Operator가 아닌 경우

해당 없음

해당 없음

s3object에서 int(_1),int( 1.2 + 3.4)를 선택합니다.

AWS 캐스팅 Operator가 아닌 경우

해당 없음

해당 없음

s3object에서 float(1.2)를 선택합니다.

AWS 캐스팅 Operator가 아닌 경우

해당 없음

해당 없음

select to_timestamp('1999-10-10T12:23:44Z') from s3object;

집계 기능

일요일

해당 없음

select sum(int(_1)) from s3object;

집계 기능

AVG

해당 없음

s3object에서 avg(cast(_1 as float) + cast(_2 as int))를 선택합니다.

집계 기능

해당 없음

s3object에서 avg(cast(_1 a float) + cast(_2 as int))를 선택합니다.

집계 기능

max

해당 없음

s3object에서 max(float(_1)),min(int(_5))을 선택합니다.

집계 기능

count

해당 없음

s3object에서 count(*)를 선택합니다. 여기서 (int(1)+int(_3))>int(_5);

타임 스탬프 기능

extract

해당 없음

extract(year from to_timestamp(_2)) > extract(year from to_timestamp(_2))에서 count(*)를 선택하고 <year from to_timestamp(_1)를 추출합니다.

타임 스탬프 기능

DateAdd

해당 없음

s3object에서 date_diff(year,to_timestamp(_1),date_add(day,366,to_timestamp(_1)) = 1을 선택합니다.

타임 스탬프 기능

datediff

해당 없음

s3object에서 count(0)를 선택합니다. 여기서 date_diff(month,to_timestamp(_1),to_timestamp(_2)) = 2;

타임 스탬프 기능

utcnow

해당 없음

s3object에서 count(0)를 선택합니다. 여기서 date_diff(hour,utcnow(),date_add(day,1,utcnow())) = 24

타임 스탬프 기능

to_string

해당 없음

s3object에서 to_string( to_timestamp("2009-09-17T17:56:06.234567Z"), "yyyyMMdd-H:m:s")를 선택합니다.

문자열 기능

하위 문자열

해당 없음

int(substring(_1,1,4)>1950 및 int(substring(_1,1,4))<1960인 s3object에서 count(0)를 선택합니다.

문자열 기능

하위 문자열

음수가 포함된 하위 문자열은 첫 번째 것으로 간주됩니다.

select substring(“123456789” from -4) from s3object;

문자열 기능

하위 문자열

범위를 벗어난 숫자의 하위 문자열은 (first,last)와 동일합니다.

select substring(“123456789” from 0 for 100) from s3object;

문자열 기능

Trim

해당 없음

s3object에서 trim(' foobar ')을 선택합니다.

문자열 기능

Trim

해당 없음

s3object에서 trim(trailing from ' foobar ')을 선택합니다.

문자열 기능

Trim

해당 없음

s3object에서 트리를 선택합니다(예: foobar ')

문자열 기능

Trim

해당 없음

s3object에서 트리밍(1112211foobar22211122')을 선택합니다.

문자열 기능

낮음 또는 상한

해당 없음

s3object에서 lower('ABcD12#$e')을 선택합니다.

문자열 기능

char_length, character_length

해당 없음

char_length(_3)=3인 s3object에서 count(*)를 선택합니다.

복잡한 쿼리

해당 없음

해당 없음

sum(cast(_1 as int)),max(cast(_3 as int)), 하위 문자열('abcdefghijklm', (2-1)*3+sum(_1 as int))/sum(cast(_1 as int))+1, (count() + count(0))을 s3object에서 선택합니다.

별칭 지원

해당 없음

해당 없음

int(_1)를 a1, int(_2)를 a2로, (a1+a2)를 s3object 여기서 a3>100 및 a3<300으로 선택합니다.

Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 문서 정보

Legal Notice

Theme

© 2026 Red Hat
맨 위로 이동