검색

3.5. S3 Select operations

download PDF

개발자는 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

요청 엔티티

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 형식으로 반환됩니다.

페이로드
설명
페이로드 매개 변수의 루트 수준 태그입니다.
유형
문자열
필수 항목
제공됨
레코드
설명
레코드 이벤트입니다.
유형
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 명령의 일부만 지원됩니다.

기능세부 정보설명예제

연산 연산자

^ * % / + - ( )

 

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 을 반환합니다.

select count(*) from s3object where (null*1.5) != 3;

누락된 열

알 수 없는 상태

 

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이 아닌 첫 번째 인수를 반환합니다.

select coalesce(nullif(5,5),nullif(1,1.0),age+12) from s3object;

논리 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

 

{expression} like {match-pattern}

'%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가 아닌 경우

  

select int(_1),int( 1.2 + 3.4) from s3object;

AWS 캐스팅 Operator가 아닌 경우

  

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

AWS 캐스팅 Operator가 아닌 경우

  

s3object에서 to_timestamp('1999-10-10T12:23:44Z')를 선택합니다.

집계 기능

일요일

 

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

 

select max(float(_1)),min(int(_5)) from s3object;

집계 기능

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)를 선택합니다.

문자열 기능

하위 문자열

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

s3object에서 하위 문자열("123456789"을 -4)을 선택합니다.

문자열 기능

하위 문자열

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

s3object에서 하위 문자열("123456789"에서 0의 경우 100)을 선택합니다.

문자열 기능

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으로 선택합니다.

추가 리소스

3.5.2. S3 지원 선택 함수

S3 select supports the following functions: .Timestamp

to_timestamp(string)
설명
문자열을 timestamp 기본 형식으로 변환합니다. 문자열 형식에서 누락된 '시간' 값은 0으로 채워집니다. 월과 일 값의 경우 1은 기본값입니다. '시간 영역' 형식은 +/-HH:mm 또는 Z입니다. 여기서 'Z' 문자는 UTC(Coordinated Universal Time)를 나타냅니다. 시간대 값의 범위는 12:00에서 +14:00 사이입니다.
지원됨

현재 다음 문자열 형식을 타임 스탬프로 변환할 수 있습니다.

  • YYYY-MM-DDTHH:mm:ss.SSSSSS+/-HH:mm
  • YYYY-MM-DDTHH:mm:ss.SSSSSSZ
  • YYYY-MM-DDTHH:mm:ss+/-HH:mm
  • YYYY-MM-DDTHH:mm:ssZ
  • YYYY-MM-DDTHH:mm+/-HH:mm
  • YYYY-MM-DDTHH:mmZ
  • YYYY-MM-DDT
  • YYYYT
to_string(timestamp, format_pattern)
설명
지정된 입력 문자열 형식으로 입력 타임스탬프의 문자열 표현을 반환합니다.
매개 변수
형식예제설명

YY

69

2년 숫자입니다.

y

1969

4년차 숫자입니다.

YYYY

1969

zero-padded 4자리 연도.

M

1

해당 연도의 월입니다.

MM

01

해당 연도의 제로 추가 월입니다.

MMM

1월

연도 이름의 축약된 월입니다.

MMMM

1월

연도의 전체 이름입니다.The full month of the year.

MMMMM

J

연중 첫 번째 편지입니다. to_timestamp 함수와 함께 사용하면 유효하지 않습니다.

d

2

달의 날 (1-31).

dd

02

해당 월의 제로 추가 일(01-31).

a

AM

오전 또는 오후

h

3

하루 (1-12)

hh

03

0padded hour of day (01-12)

H

3

시간(0-23)입니다.

HH

03

0padded hour of the day (00-23).

m

4

시간(0-59)의 분입니다.

mm

04

시간(00-59)의 0padded 분.

S

5

분의 초(0-59)입니다.

SS

05

분의 1초(00-59)입니다.

S

1

초의 분수(정밀: 0.1, 범위: 0.0-0.9).

SS

12

초의 분수(정수: 0.01, 범위: 0.0-0.99).

SSS

123

초의 분수(정밀: 0.01, 범위: 0.0-0.999).

SSSS

1234

초의 분수(정수: 0.001, 범위: 0.0-0.9999).

SSSSSS

123456

초의 분수(최대 정확도: 1 나노초, 범위: 0.0-0.999999).

n

60000000

second 입니다.

X

+07 또는 Z

오프셋이 0인 경우 시간 또는 "Z"로 오프셋합니다.

XX 또는 XXXX

+0700 또는 Z

오프셋이 0인 경우 시간 및 분 또는 "Z"로 오프셋합니다.

XXX 또는 XXXXX

+07:00 또는 Z

오프셋이 0인 경우 시간 및 분 또는 "Z"로 오프셋합니다.

x

7

시간 내에 오프셋합니다.

Xx 또는 xxxx

700

시간 및 분 단위로 오프셋합니다.

xxx 또는 xxxxx

+07:00

시간 및 분 단위로 오프셋합니다.

extract(date-part from timestamp)
설명
입력 타임스탬프에서 date-part 추출에 따라 정수를 반환합니다.
지원됨
year, month, week, week, day, minute, second, timezone_minute.
date_add(date-part ,integer,timestamp)
설명
입력 타임스탬프 및 date-part 결과를 기반으로 하는 타임 스탬프를 반환합니다.
지원됨
year, month, day, hour, minute, second.
date_diff(date-part,timestamp,timestamp)
설명
date-part에 따라 두 타임스탬프의 차이에 대한 계산된 결과인 정수를 반환합니다.
지원됨
year, month, day, hour, minute, second.
utcnow()
설명
현재 시간 타임스탬프를 반환합니다.

집계

count()
설명
1인 경우 조건과 일치하는 행 수를 기반으로 정수를 반환합니다.
sum(expression)
설명
항목이 하나 있는 경우 조건과 일치하는 각 행에 대한 요약을 반환합니다.
avg(expression)
설명
하나의 조건이 있는 경우 조건과 일치하는 각 행의 평균 표현식을 반환합니다.
max(expression)
설명
하나가 있는 경우 조건과 일치하는 모든 표현식의 최대 결과를 반환합니다.
min(expression)
설명
하나의 조건이 있는 경우 조건과 일치하는 모든 표현식에 대한 최소 결과를 반환합니다.

문자열

하위 문자열(문자열, from,for)
설명
입력에 대해 from에 따라 입력 문자열에서 문자열 추출을 반환합니다.
Char_length
설명
문자열에 있는 여러 문자를 반환합니다. character_length도 동일한 작업을 수행합니다.
Trim([[leading | trailing | both remove_chars] from] string )
설명
대상 문자열에서 선행/추적(또는 둘 다) 문자를 트리밍합니다. 기본값은 공백 문자입니다.
상위\lower
설명
문자를 대문자 또는 소문자로 변환합니다.

NULL

NULL 값이 없거나 NULL 인 알 수 없는 연산에 대한 값을 생성할 수 없습니다. 연산 비교에도 동일하게 적용되며, NULL 에 대한 비교는 알 수 없는 NULL 입니다.

표 3.4. NULL 사용 사례
A는 NULL입니다.result(NULL=UNKNOWN)

Not A

NULL

A 또는 False

NULL

A 또는 True

True

A 또는 A

NULL

A 및 False

False

A 및 True

NULL

A 및 A

NULL

추가 리소스

3.5.3. S3 별칭 프로그래밍 구성

별칭 프로그래밍 구문은 많은 열 또는 복잡한 쿼리가 포함된 개체로 더 잘 프로그래밍할 수 있기 때문에 s3 선택 언어의 필수 부분입니다. 별칭 구문이 있는 문을 구문 분석할 때 별칭을 올바른 프로젝션 열에 대한 참조로 바꾸고 쿼리 실행 시 참조는 다른 식과 같이 평가됩니다. 별칭은 별칭을 두 번 이상 사용하는 경우 캐시의 결과가 사용되므로 동일한 표현식이 평가되지 않고 동일한 결과가 반환됩니다. 현재 Red Hat은 열 별칭을 지원합니다.

예제

select int(_1) as a1, int(_2) as a2 , (a1+a2) as a3 from s3object where a3>100 and a3<300;")

3.5.4. S3 구문 분석 설명

S3 선택 엔진에는 CSV, Parquet, JSON 등 세 가지 파일 형식 모두에 대한 구문 분석기가 있어 더 처리 가능한 구성 요소로 명령을 분리한 다음 각 구성 요소를 정의하는 태그에 연결됩니다.

3.5.4.1. S3 CSV 구문 분석

입력 직렬화가 있는 CSV 정의에서는 다음 기본값을 사용합니다.

  • row-delimiter에는 {\n}' 을 사용합니다.
  • 인용에는 {"} 를 사용합니다.
  • 이스케이프 문자에는 {\} 를 사용합니다.

csv-header-info 는 AWS-CLI에 표시되는 경우 구문 분석됩니다. 스키마가 포함된 입력 오브젝트의 첫 번째 행입니다. 현재 출력 직렬화 및 압축 유형이 지원되지 않습니다. S3 선택 엔진에는 S3 개체를 구문 분석하는 CSV 구문 분석기가 있습니다.

  • 각 행은 row-delimiter로 끝납니다.
  • 필드 분리기는 인접한 열을 구분합니다.
  • 연속 필드 구분자는 NULL 열을 정의합니다.
  • 인용 문자는 필드를 재정의합니다. 즉, 필드 구분 기호는 따옴표 사이의 문자입니다.
  • 이스케이프 문자는 행 구분 기호를 제외한 특수 문자를 비활성화합니다.

다음은 CSV 구문 분석 규칙의 예입니다.

표 3.5. CSV 구문 분석
기능설명입력 (토큰)

NULL

연속 필드 구분 기호

,,1,,2, =⇒ {null}{null}{1}{null}{2}{null}

QUOTE

인용 문자는 필드 구분자를 덮어씁니다.

11,22,”a,b,c,d”,last =⇒ {11}{22}{“a,b,c,d”}{last}

escape

이스케이프 문자는 메타 문자를 덮어씁니다.

오브젝트 소유자의 IDDisplayName의 컨테이너

행 구분 기호

닫은 따옴표가 없습니다. 행 구분 기호는 닫는 줄입니다.

11,22,a=”str,44,55,66 =⇒ {11}{22}{a=”str,44,55,66}

CSV 헤더 정보

FileHeaderInfo tag

USE 값은 첫 번째 줄의 각 토큰이 열 이름임을 의미합니다. IGNORE 값은 첫 번째 행을 건너뛰는 것을 의미합니다.

추가 리소스

3.5.4.2. S3 Parquet 구문 분석

Apache Parquet는 효율적인 데이터 저장 및 검색을 위해 설계된 오픈 소스 데이터 파일 형식입니다.

S3 select 엔진의 Parquet parser는 다음과 같이 S3 개체를 구문 분석합니다.

예제

4-byte magic number "PAR1"
<Column 1 Chunk 1 + Column Metadata>
<Column 2 Chunk 1 + Column Metadata>
...
<Column N Chunk 1 + Column Metadata>
<Column 1 Chunk 2 + Column Metadata>
<Column 2 Chunk 2 + Column Metadata>
...
<Column N Chunk 2 + Column Metadata>
...
<Column 1 Chunk M + Column Metadata>
<Column 2 Chunk M + Column Metadata>
...
<Column N Chunk M + Column Metadata>
File Metadata
4-byte length in bytes of file metadata
4-byte magic number "PAR1"

  • 위의 예제에는 이 테이블에 N개의 열이 있으며 M 행 그룹으로 나뉩니다. 파일 메타데이터에는 모든 열 메타데이터 시작 위치의 위치가 포함되어 있습니다.
  • 메타데이터는 단일 패스 쓰기를 허용할 데이터 뒤에 작성됩니다.
  • 모든 열 청크는 나중에 순차적으로 읽어야 하는 파일 메타데이터에서 찾을 수 있습니다.
  • 형식은 데이터와 메타데이터를 분리하도록 명시적으로 설계되었습니다. 이렇게 하면 열을 여러 파일로 분할하고 단일 메타데이터 파일을 여러 개의 parquet 파일을 참조할 수 있습니다.

3.5.4.3. S3 JSON 구문 분석

JSON 문서를 사용하면 제한 없이 개체 또는 배열 내에 값을 중첩할 수 있습니다. S3 선택 엔진의 JSON 문서의 특정 값을 쿼리할 때 값의 위치는 SELECT 문의 경로를 통해 지정됩니다.

JSON 문서의 일반 구조에는 CSV 및 Parquet와 같은 행 및 열 구조가 없습니다. 대신 JSON 문서를 쿼리할 때 행과 열을 정의하는 SQL 문 자체입니다.

S3 Select 엔진의 JSON 구문 분석기는 다음과 같이 S3 개체를 구문 분석합니다.

  • SELECT 문의 FROM 절은 행 경계를 정의합니다.
  • JSON 문서의 행은 CSV 개체에 대한 행을 정의하는 데 행 구분 기호를 사용하는 방법 및 Parquet 오브젝트에 대한 행을 정의하는 데 사용되는 방법과 유사합니다.
  • 다음 예제를 고려하십시오.

    예제

    {
        "firstName": "Joe",
        "lastName": "Jackson",
        "gender": "male",
        "age": "twenty"
    },
    
    {
        "firstName": "Joe_2",
        "lastName": "Jackson_2",
        "gender": "male",
        "age": 21
    },
    
    "phoneNumbers":
    [
        { "type": "home1", "number": "734928_1","addr": 11 },
        { "type": "home2", "number": "734928_2","addr": 22 }
    ],
    
    "key_after_array": "XXX",
    
    "description" :
    {
        "main_desc" : "value_1",
        "second_desc" : "value_2"
    }
    
    # the from-clause define a single row.
    # _1 points to root object level.
    # _1.age appears twice in Documnet-row, the last value is used for the operation.
    query = "select _1.firstname,_1.key_after_array,_1.age+4,_1.description.main_desc,_1.description.second_desc from s3object[*].aa.bb.cc;";
    
    expected_result = Joe_2,XXX,25,value_1,value_2

    • 이 설명은 리더에게 aa.bb.cc 경로를 검색하고 이 경로의 발생에 따라 행 경계를 정의하도록 지시합니다.
    • 행은 독자가 경로에 직면할 때 시작되고, 리더가 경로의 가장 내부 부분을 종료할 때 종료됩니다. 이 경우 오브젝트 cc 입니다.

3.5.5. Ceph Object Gateway와 Trino 통합

사용자가 S3 개체에서 SQL 쿼리 9x를 더 빠르게 실행할 수 있는 중요한 유틸리티인 Trino와 Ceph Object Gateway를 통합합니다.

다음은 Trino 사용의 몇 가지 이점입니다.

  • Trino는 완전한 SQL 엔진입니다.
  • S3를 푸시하면 Trino 엔진이 서버 측에서 실행하는 데 비용 효율적인 SQL 문의 일부를 식별할 수 있는 요청을 선택합니다.
  • Ceph/S3select의 최적화 규칙을 사용하여 성능을 향상시킵니다.
  • Red Hat Ceph Storage 확장성을 활용하여 원본 오브젝트를 동일한 여러 부분으로 분할하고 S3 Select requests를 수행하고 요청을 병합합니다.
중요

trino를 쿼리하는 동안 s3select 구문이 작동하지 않는 경우 SQL 구문을 사용합니다.

사전 요구 사항

  • Ceph Object Gateway가 설치된 실행 중인 Red Hat Ceph Storage 클러스터
  • Docker 또는 Podman이 설치되어 있어야 합니다.
  • 생성된 버킷입니다.
  • 오브젝트가 업로드됩니다.

프로세스

  1. Trino 및 hive를 배포합니다.

    예제

    [cephuser@host01 ~]$ git clone https://github.com/ceph/s3select.git
    [cephuser@host01 ~]$ cd s3select

  2. S3 끝점, 액세스 키 및 시크릿 키로 hms_trino.yaml 파일을 수정합니다.

    예제

    [cephuser@host01 s3select]$ cat container/trino/hms_trino.yaml
    version: '3'
    services:
      hms:
        image: galsl/hms:dev
        container_name: hms
        environment:
          # S3_ENDPOINT the CEPH/RGW end-point-url
          - S3_ENDPOINT=http://rgw_ip:port
          - S3_ACCESS_KEY=abc
          - S3_SECRET_KEY=abc
        # the container starts with booting the hive metastore
        command: sh -c '. ~/.bashrc; start_hive_metastore'
        ports:
          - 9083:9083
        networks:
          - trino_hms
    
      trino:
        image: trinodb/trino:405
        container_name: trino
        volumes:
          # the trino directory contains the necessary configuration
          - ./trino:/etc/trino
        ports:
          - 8080:8080
        networks:
          - trino_hms
    
    networks:
      trino_hm

  3. S3 끝점, 액세스 키 및 시크릿 키로 hive.properties 파일을 수정합니다.

    예제

    [cephuser@host01 s3select]$ cat container/trino/trino/catalog/hive.properties
    connector.name=hive
    hive.metastore.uri=thrift://hms:9083
    
    #hive.metastore.warehouse.dir=s3a://hive/
    
    hive.allow-drop-table=true
    hive.allow-rename-table=true
    hive.allow-add-column=true
    hive.allow-drop-column=true
    hive.allow-rename-column=true
    
    hive.non-managed-table-writes-enabled=true
    hive.s3select-pushdown.enabled=true
    hive.s3.aws-access-key=abc
    hive.s3.aws-secret-key=abc
    
    # should modify per s3-endpoint-url
    hive.s3.endpoint=http://rgw_ip:port
    #hive.s3.max-connections=1
    #hive.s3select-pushdown.max-connections=1
    
    hive.s3.connect-timeout=100s
    hive.s3.socket-timeout=100s
    hive.max-splits-per-second=10000
    hive.max-split-size=128MB

  4. Trino 컨테이너를 시작하여 Ceph Object Gateway를 통합합니다.

    예제

    [cephuser@host01 s3select]$ sudo docker compose -f ./container/trino/hms_trino.yaml up -d

  5. 통합을 확인합니다.

    예제

    [cephuser@host01 s3select]$ sudo docker exec -it trino /bin/bash
    trino@66f753905e82:/$ trino
    trino> create schema hive.csvbkt1schema;
    trino> create table hive.csvbkt1schema.polariondatacsv(c1 varchar,c2 varchar, c3 varchar, c4 varchar, c5 varchar, c6 varchar, c7 varchar, c8 varchar, c9 varchar) WITH ( external_location = 's3a://csvbkt1/',format = 'CSV');
    trino> select * from hive.csvbkt1schema.polariondatacsv;

    참고

    외부 위치는 파일 끝부분이 아닌 버킷 이름 또는 디렉터리를 가리켜야 합니다.

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

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

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

Red Hat 소개

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

© 2024 Red Hat, Inc.