Release 341
Release 341 (2020년 9월 8일)
Presto 341 릴리스예요. Iceberg 커넥터 추가와 타임스탬프 의미론의 SQL 표준 준수 변경이라는 두 가지 큰 변화가 담긴 버전이에요. 시간대 처리 방식이 바뀌어 업그레이드 시 주의가 필요해요.
본문
General
- 가변 정밀도(variable-precision)
TIME타입 지원을 추가했어요(#4381). - 가변 정밀도
TIME WITH TIME ZONE타입 지원을 추가했어요(#4905). - Iceberg 커넥터를 추가했어요.
human_readable_seconds()함수를 추가했어요(#4344).VARBINARY에 대한reverse()함수를 추가했어요(#4741).- time zone이 있는
timestamp(p)에서 p가 3이 아닌 값에 대한extract()지원을 추가했어요(#4867). - 재귀 쿼리에서 상관 서브쿼리(correlated subqueries) 지원을 추가했어요(#4877).
runtime.optimizer_rule_stats시스템 테이블을 추가했어요(#4659).- 동적 필터 통계를 보고하도록 했어요(#4440).
- 클러스터에 새 노드를 추가할 때 쿼리 확장성을 개선했어요(#4294).
- JSON 파싱 실패 시 오류 메시지를 개선했어요(#4616).
- 동적 필터링을 사용할 때 지연 시간을 줄였어요(#4924).
TIME WITH TIME ZONE타입에서 정치적 시간대(political time zones) 지원을 제거했어요(#191).- 더 이상 쓰이지 않는
reorder_joins세션 속성을 제거했어요(#5027). deprecated.legacy-timestamp설정 속성과legacy_timestamp세션 속성을 제거했어요(#4799).- 타임스탬프 연산을 SQL 표준과 일치하도록 변경했어요.
TIMESTAMP타입의 값은 세션 시간대의 영향을 받지 않아요(#37). TIMESTAMP타입 값에AT TIME ZONE을 적용할 때 정밀도를 보존하도록 했어요(#4866).- 오래된 Presto 클라이언트에 대한
ROW,MAP,ARRAY타입의NULL값 직렬화 문제를 고쳤어요(#4778). - 집계 쿼리에 중복 표현식이 포함됐을 때 실패하던 문제를 고쳤어요(#4872).
- 정밀도가 6보다 큰 타임스탬프를 질의할 때 컴파일러 실패를 고쳤어요(#4824).
- 일광 절약 시간(daylight saving) 변경으로 인한 타임스탬프 파싱 실패를 고쳤어요(#37).
TIMESTAMP WITH TIME ZONE타입에 대해TIMEZONE_HOUR와TIMEZONE_MINUTE로extract()를 호출할 때 실패하던 문제를 고쳤어요(#4867).- 동적 필터를 기다리는 커넥터에 대한 쿼리 교착 상태(deadlock)를 고쳤어요(#4946).
TIME·TIMESTAMP뺄셈이 음수 값을 반환할 때 실패하던 문제를 고쳤어요(#4847).DISTINCT절에 중복 표현식이 나타날 때 실패하던 문제를 고쳤어요(#4787).- 스필링 중이거나 사용 가능한 메모리가 적을 때 특정 조인 쿼리가 실패하던 문제를 고쳤어요(#4994).
query.max-scan-physical-bytes설정 속성이 정의되지 않았을 때query_max_scan_physical_bytes세션 속성이 무시되던 문제를 고쳤어요(#5009).TABLESAMPLE이 분수 백분율과 함께 쓰일 때 샘플 비율을 올바르게 계산하도록 했어요(#5074).TABLESAMPLE이 숫자가 아닌 샘플 비율과 함께 쓰일 때 적절한 오류 메시지로 쿼리를 실패시키도록 했어요(#5074).- 특정 연산에서
OutOfMemoryError대신 명시적 오류로 실패하도록 했어요(#4890).
Security
- Salesforce 비밀번호 인증을 추가했어요(#4372).
access-control.properties에 시크릿 보간(interpolating secrets)을 지원하게 됐어요(#4854).- 인증서 인증이 활성화됐을 때만 HTTPS 클라이언트 인증서를 요청하도록 했어요(#4804).
- 사용자 이름을 대문자화·소문자화하는 User mapping 지원을 추가했어요(#4736).
Web UI
- 상세 쿼리 뷰의 물리 입력 읽기 시간 표시 문제를 고쳤어요(#4962).
JDBC 드라이버
ResultSet.getStatement()를 구현했어요(#4957).
BigQuery 커넥터
- 시간 단위 파티션(hourly partitioned) 테이블 지원을 추가했어요(#4968).
- 서버 로그에서
bigquery.credentials-key값을 가리도록(redact) 했어요(#4968).
Cassandra 커넥터
- Cassandra
TIMESTAMP타입을 PrestoTIMESTAMP(3) WITH TIME ZONE타입으로 매핑했어요(#2269).
Hive 커넥터
- ORC 파일의 타임스탬프 통계를 기반으로 스트라이프와 행 그룹을 건너뛰도록 했어요(#1147).
hive.s3.skip-glacier-objects가 활성화됐을 때 Glacier 스토리지 클래스에 더해 DeepArchive 스토리지 클래스의 S3 객체도 건너뛰도록 했어요(#5002).- 정렬된 버킷팅(sorted bucketed) 테이블에 쓸 때 임시 파일에 임시 스테이징 디렉터리를 사용하도록 했어요. 덕분에 임시 파일에 더 효율적인 파일 시스템을 쓸 수 있어요(#3434).
GRANT와REVOKE에 대한 메타스토어 캐시 무효화 문제를 고쳤어요(#4768).- 이진 타임스탬프 값을 특정 시간대로 조정하는 Parquet·RCBinary 설정 속성
hive.parquet.time-zone과hive.rcfile.time-zone을 추가했어요. Hive 3.1+에서는 이 값을UTC로 설정해야 해요. 기본값은 이전 Hive 버전과의 하위 호환성을 위해 JVM 기본 시간대예요(#4799). - time zone을 선언하지 않은 레거시 ORC 파일의 기본 시간대를 설정하는 ORC 설정 속성
hive.orc.time-zone을 추가했어요(#4799). hive.time-zone설정 속성을 형식별 속성hive.orc.time-zone,hive.parquet.time-zone,hive.rcfile.time-zone으로 대체했어요(#4799).- S3 보안 매핑과 함께 클러스터 기본 역할을 사용할 수 있게 했어요(#4931).
- timestamp에 대한 버킷팅 지원을 제거했어요. timestamp의 해시 함수 정의가 저장 시간대에 부정확하게 의존해 잘못된 결과를 낼 수 있기 때문이에요(#4759).
- 파티션을 가져올 때 Glue 메타스토어로의 요청 수를 줄였어요. 이는 속도 제한(rate limits)에 걸리는 것을 피하고 서비스 비용을 줄여요(#4938).
- HDFS에서 새 파일을 만들 때 테이블·파티션의 기존 사용자·그룹을 일치시키도록 했어요(#4414).
- Text, Avro, SequenceFile, JSON, CSV 형식의 중첩 데이터에 대한 잘못된 타임스탬프 값을 고쳤어요(#4799).
- ORC ACID 테이블이 경미한 테이블 컴팩션(minor compaction)을 거친 후 필터와 함께 그 테이블을 읽을 때 쿼리가 실패하던 문제를 고쳤어요(#4622).
- 삭제된 행이 있고 경미한 컴팩션을 거친 ORC ACID 테이블을 읽을 때 잘못된 쿼리 결과가 나오던 문제를 고쳤어요(#4623).
- 스토리지 캐싱이 활성화되고 쿼리 실행 중 캐시된 데이터가 축출(evicted)될 때 쿼리가 실패하던 문제를 고쳤어요(#3580).
JMX 커넥터
- 히스토리 테이블의 timestamp 컬럼 타입을
TIMESTAMP WITH TIME ZONE으로 변경했어요(#4753).
Kafka 커넥터
TIMESTAMP WITH TIME ZONE값을 파싱할 때 시간대를 보존하도록 했어요(#4799).
Kinesis 커넥터
TIMESTAMP WITH TIME ZONE값을 파싱할 때 시간대를 보존하도록 했어요(#4799).
Kudu 커넥터
- decimal 타입의 기본 키를 가진 테이블에 delete를 적용할 때의 문제를 고쳤어요(#4683).
Local File 커넥터
- timestamp 컬럼 타입을
TIMESTAMP WITH TIME ZONE으로 변경했어요(#4752).
MySQL 커넥터
- 집계 계산을 MySQL 데이터베이스로 push해 집계 쿼리 성능을 개선했어요. 현재 다음 집계 함수가 pushdown 대상이에요:
count,min,max,sum,avg(#4138).
Oracle 커넥터
- 풀링된 연결이 닫히기 전에 비활성 상태로 있을 수 있는 시간을 지정하는
oracle.connection-pool.inactive-timeout설정 속성을 추가했어요. 기본값은 20분이에요(#4779). - 데이터베이스 국제화(internationalization) 지원을 추가했어요(#4775).
- 일시적인 연결 인증 문제에 대한 탄력성(resilience)을 추가했어요(#4947).
- 특정 타입을
VARCHAR로 강제 매핑할 수 있게 했어요.jdbc-types-mapped-to-varchar설정 속성을 타입 이름의 쉼표 구분 목록으로 설정하면 활성화돼요(#4955). - 많은 수의 conjunct를 포함한 조건자의 pushdown으로 인한 쿼리 실패를 방지했어요(#4918).
Phoenix 커넥터
- 그 컬럼을 지정하지 않고 insert를 적용했을 때 이전 값을 덮어쓰던 문제를 고쳤어요(#4670).
Pinot 커넥터
REAL과INTEGER타입 지원을 추가했어요(#4725).- pass-through 쿼리의 함수 지원을 추가했어요(#4801).
- Pinot에서 가져오는 행 수에 제한을 두도록 했어요.
pinot.max-rows-per-split-for-segment-queries설정 속성으로 설정할 수 있어요(#4723). count(*)쿼리의 잘못된 결과를 고쳤어요(#4802).long,int,float타입 컬럼에 대한avg()가 포함된 쿼리의 잘못된 결과를 고쳤어요(#4802).- pass-through 쿼리의 컬럼이 선택된 컬럼과 일치하지 않을 때 잘못된 결과가 나오던 문제를 고쳤어요(#4802).
Prometheus 커넥터
- timestamp 컬럼의 타입을
TIMESTAMP(3) WITH TIME ZONE타입으로 변경했어요(#4799).
PostgreSQL 커넥터
- 가능한 경우 필터링과 집계 계산을 모두 PostgreSQL 서버로 push해 조건자가 있는 집계 쿼리 성능을 개선했어요(#4111).
unsupported-type-handling이CONVERT_TO_VARCHAR로 설정됐을 때 PostgreSQL 배열 처리 문제를 고쳤어요(#4981).
Raptor 커넥터
- Presto의 레거시 타임스탬프 의미론을 우회하는 데 쓰이던
storage.shard-day-boundary-time-zone설정 속성을 제거했어요(#4799).
Redis 커넥터
TIMESTAMP WITH TIME ZONE값을 파싱할 때 시간대를 보존하도록 했어요(#4799).
SPI
TIMESTAMP타입은 proleptic 그레고리력에서 1970-01-01 00:00:00부터의 분수 초(fractional seconds) 수로 인코딩돼요. 이 값은 더 이상 세션 시간대로 조정되지 않아요. 정밀도가 3 이하인 타임스탬프는 이제 마이크로초 단위로 표현돼요(#4799).ConnectorSession에서isLegacyTimestamp()를 제거했어요(#4799).- 커넥터가 워커 노드에서 데이터를 만들기 전에 동적 필터를 기다릴 수 있게 했어요(#3414).
더 알아보기 (Learn more)
이 릴리스의 타임스탬프 의미론 변경(SQL 표준 준수)은 이후 Trino의 시간대 처리 표준으로 정착했어요. Iceberg 커넥터 추가와 함께, 최신 Trino의 타임스탬프 타입과 Iceberg 커넥터 문서를 함께 확인해 보세요.