Input sources

Input sources

input source는 Apache Druid 네이티브 배치 수집에서 index task가 데이터를 읽을 위치를 정의해요. 네이티브 병렬(parallel) 태스크와 simple task만 input source를 지원합니다.

네이티브 배치 인덱싱과 병렬 태스크 인덱싱에 대한 일반 정보는 Native batch ingestion을 참고하세요.

출처: 문서

본문

S3 input source

필수 확장

S3 input source를 사용하려면 common.runtime.properties 파일에 확장 druid-s3-extensions을 로드하세요.

S3 input source는 S3에서 객체를 직접 읽습니다. 다음 중 하나를 지정할 수 있어요.

  • S3 URI 문자열 목록
  • 해당 위치 안의 내용을 나열하고 포함된 모든 객체를 수집하려 시도하는 S3 위치 접두사 목록

S3 input source는 분할 가능(splittable)해요. 따라서 parallel task와 함께 사용할 수 있고, index_parallel의 각 worker task가 하나 또는 여러 객체를 읽습니다.

샘플 스펙:

...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "s3",        "objectGlob": "**.json",        "uris": ["s3://foo/bar/file.json", "s3://bar/foo/file2.json"]      },      "inputFormat": {        "type": "json"      },      ...    },...
...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "s3",        "objectGlob": "**.parquet",        "prefixes": ["s3://foo/bar/", "s3://bar/foo/"]      },      "inputFormat": {        "type": "json"      },      ...    },...
...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "s3",        "objectGlob": "**.json",        "objects": [          { "bucket": "foo", "path": "bar/file1.json"},          { "bucket": "bar", "path": "foo/file2.json"}        ]      },      "inputFormat": {        "type": "json"      },      ...    },...
...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "s3",        "objectGlob": "**.json",        "uris": ["s3://foo/bar/file.json", "s3://bar/foo/file2.json"],        "properties": {          "accessKeyId": "KLJ78979SDFdS2",          "secretAccessKey": "KLS89s98sKJHKJKJH8721lljkd"        }      },      "inputFormat": {        "type": "json"      },      ...    },...
...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "s3",        "objectGlob": "**.json",        "uris": ["s3://foo/bar/file.json", "s3://bar/foo/file2.json"],        "properties": {          "accessKeyId": "KLJ78979SDFdS2",          "secretAccessKey": "KLS89s98sKJHKJKJH8721lljkd",          "assumeRoleArn": "arn:aws:iam::2981002874992:role/role-s3"        }      },      "inputFormat": {        "type": "json"      },      ...    },...
...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "s3",        "uris": ["s3://foo/bar/file.json", "s3://bar/foo/file2.json"],        "endpointConfig": {             "url" : "s3-store.aws.com",             "signingRegion" : "us-west-2"         },         "clientConfig": {             "protocol" : "http",             "disableChunkedEncoding" : true,             "enablePathStyleAccess" : true,             "crossRegionAccessEnabled" : false         },         "proxyConfig": {             "host" : "proxy-s3.aws.com",             "port" : 8888,             "username" : "admin",             "password" : "admin"         },        "properties": {          "accessKeyId": "KLJ78979SDFdS2",          "secretAccessKey": "KLS89s98sKJHKJKJH8721lljkd",          "assumeRoleArn": "arn:aws:iam::2981002874992:role/role-s3"        }      },      "inputFormat": {        "type": "json"      },      ...    },...

| Property | Description | Default | Required | | type | 값을 s3로 설정 | None | yes | | uris | 수집할 S3 객체가 있는 URI의 JSON 배열 | None | uris 또는 prefixes 또는 objects 중 하나를 설정해야 함 | | prefixes | 수집할 S3 객체 위치의 URI 접두사 JSON 배열. 주어진 접두사 중 하나로 시작하는 빈 객체는 건너뜀 | None | uris 또는 prefixes 또는 objects 중 하나를 설정해야 함 | | objects | 수집할 S3 객체의 JSON 배열 | None | uris 또는 prefixes 또는 objects 중 하나를 설정해야 함 | | objectGlob | S3 URI의 객체 부분에 대한 glob. URI s3://foo/bar/file.json에서 glob은 bar/file.json에 적용됨. glob은 파일 이름뿐 아니라 객체 부분 전체와 일치해야 함. 예를 들어 glob *.json은 s3://foo/bar/file.json과 일치하지 않는데, 객체 부분이 bar/file.json이라 *가 슬래시와 일치하지 않기 때문. .json으로 끝나는 모든 객체와 일치시키려면 대신 **.json을 사용. 자세한 내용은 FileSystem#getPathMatcher 문서를 참고 | None | no | | systemFields | 입력 행의 일부로 반환할 시스템 필드 JSON 배열. 가능한 값: __file_uri(s3://로 시작하는 S3 URI), __file_bucket(S3 버킷), __file_path(S3 객체 키) | None | no | | endpointConfig | 기본 S3 엔드포인트와 서명 리전을 재정의하는 구성. 다른 S3 스토어에서 데이터를 수집할 수 있게 해 줌. 자세한 내용은 s3 config 참고 | None | No (제공하지 않으면 기본값 사용) | | clientConfig | 재정의된 s3 엔드포인트에 대한 S3 클라이언트 속성. endPointConfig와 함께 사용. 자세한 내용은 s3 config 참고 | None | No (제공하지 않으면 기본값 사용) | | proxyConfig | 재정의된 s3 엔드포인트에 대한 프록시 정보 지정 속성. clientConfig와 함께 사용. 자세한 내용은 s3 config 참고 | None | No (제공하지 않으면 기본값 사용) | | properties | 기본 S3 구성을 재정의하는 Properties Object. 자세한 내용은 아래 참고 | None | No (제공하지 않으면 기본값 사용) |

S3 input source는 prefixes가 지정된 경우에만 모든 빈 객체를 건너뜁니다.

S3 Object:

| Property | Description | Default | Required | | bucket | S3 버킷 이름 | None | yes | | path | 데이터가 있는 경로 | None | yes |

Properties Object:

| Property | Description | Default | Required | | accessKeyId | 이 S3 input source 액세스 키의 Password Provider 또는 평문 문자열 | None | secretAccessKey 또는 sessionToken이 주어지면 Yes | | secretAccessKey | 이 S3 input source 시크릿 키의 Password Provider 또는 평문 문자열 | None | accessKeyId 또는 sessionToken이 주어지면 Yes | | sessionToken | 이 S3 input source 세션 토큰의 Password Provider 또는 평문 문자열 | None | no | | assumeRoleArn | 수임할 역할의 AWS ARN 참고. assumeRoleArn은 인제션 스펙 AWS 자격 증명 또는 기본 S3 자격 증명과 함께 사용 가능 | None | no | | assumeRoleExternalId | 다른 계정에서 역할을 수임할 때 필요할 수 있는 고유 식별자 참고 | None | no |

정보

accessKeyId와 secretAccessKey가 주어지지 않으면 기본 S3 자격 증명 제공자 체인(default S3 credentials provider chain)이 사용됩니다.

Google Cloud Storage input source

필수 확장

Google Cloud Storage input source를 사용하려면 common.runtime.properties 파일에 확장 druid-google-extensions을 로드하세요.

Google Cloud Storage input source는 Google Cloud Storage에서 객체를 직접 읽는 것을 지원해요. 객체는 Google Cloud Storage URI 문자열 목록으로 지정할 수 있습니다. Google Cloud Storage input source는 분할 가능하며 parallel task에서 사용할 수 있는데, index_parallel의 각 worker task가 하나 또는 여러 객체를 읽습니다.

샘플 스펙:

...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "google",        "objectGlob": "**.json",        "uris": ["gs://foo/bar/file.json", "gs://bar/foo/file2.json"]      },      "inputFormat": {        "type": "json"      },      ...    },...
...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "google",        "objectGlob": "**.parquet",        "prefixes": ["gs://foo/bar/", "gs://bar/foo/"]      },      "inputFormat": {        "type": "json"      },      ...    },...
...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "google",        "objectGlob": "**.json",        "objects": [          { "bucket": "foo", "path": "bar/file1.json"},          { "bucket": "bar", "path": "foo/file2.json"}        ]      },      "inputFormat": {        "type": "json"      },      ...    },...

| Property | Description | Default | Required | | type | 값을 google로 설정 | None | yes | | uris | 수집할 Google Cloud Storage 객체가 있는 URI의 JSON 배열 | None | uris 또는 prefixes 또는 objects 중 하나를 설정해야 함 | | prefixes | 수집할 Google Cloud Storage 객체 위치의 URI 접두사 JSON 배열. 주어진 접두사 중 하나로 시작하는 빈 객체는 건너뜀 | None | uris 또는 prefixes 또는 objects 중 하나를 설정해야 함 | | objects | 수집할 Google Cloud Storage 객체 JSON 배열 | None | uris 또는 prefixes 또는 objects 중 하나를 설정해야 함 | | objectGlob | S3 URI의 객체 부분에 대한 glob. URI s3://foo/bar/file.json에서 glob은 bar/file.json에 적용됨. glob은 파일 이름뿐 아니라 객체 부분 전체와 일치해야 함. 예를 들어 glob *.json은 s3://foo/bar/file.json과 일치하지 않는데, 객체 부분이 bar/file.json이라 *가 슬래시와 일치하지 않기 때문. .json으로 끝나는 모든 객체와 일치시키려면 대신 **.json을 사용. 자세한 내용은 FileSystem#getPathMatcher 문서를 참고 | None | no |

Google Cloud Storage input source는 prefixes가 지정된 경우에만 모든 빈 객체를 건너뜁니다.

Google Cloud Storage object:

| Property | Description | Default | Required | | bucket | Google Cloud Storage 버킷 이름 | None | yes | | path | 데이터가 있는 경로 | None | yes | | systemFields | 입력 행의 일부로 반환할 시스템 필드 JSON 배열. 가능한 값: __file_uri(gs://로 시작하는 Google Cloud Storage URI), __file_bucket(GCS 버킷), __file_path(GCS 키) | None | no |

Azure input source

필수 확장

Azure input source를 사용하려면 common.runtime.properties 파일에 확장 druid-azure-extensions을 로드하세요.

Azure input source(azureStorage 타입 사용)는 Azure Blob 저장소 또는 Azure Data Lake 소스에서 객체를 직접 읽습니다. 객체는 파일 URI 문자열 또는 접두사 목록으로 지정할 수 있어요. Azure input source를 분할해서 parallel task 인덱싱과 함께 사용할 수 있고, 각 worker task가 분할된 데이터의 한 청크를 읽습니다.

azureStorage input source는 Azure input source의 새 스키마로, 어떤 저장소 계정에서 파일을 수집할지 지정할 수 있게 해 줍니다. 옛 azure 스키마를 사용하는 스펙은 새 azureStorage 스키마를 사용하도록 업데이트하는 것을 권장해요. 새 스키마는 옛 azure 스키마보다 더 많은 기능을 제공합니다.

샘플 스펙:

...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "azureStorage",        "objectGlob": "**.json",        "uris": ["azureStorage://storageAccount/container/prefix1/file.json", "azureStorage://storageAccount/container/prefix2/file2.json"]      },      "inputFormat": {        "type": "json"      },      ...    },...
...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "azureStorage",        "objectGlob": "**.parquet",        "prefixes": ["azureStorage://storageAccount/container/prefix1/", "azureStorage://storageAccount/container/prefix2/"]      },      "inputFormat": {        "type": "json"      },      ...    },...
...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "azureStorage",        "objectGlob": "**.json",        "objects": [          { "bucket": "storageAccount", "path": "container/prefix1/file1.json"},          { "bucket": "storageAccount", "path": "container/prefix2/file2.json"}        ],        "properties": {          "sharedAccessStorageToken": "?sv=...<storage token secret>...",        }      },      "inputFormat": {        "type": "json"      },      ...    },...

| Property | Description | Default | Required | | type | 값을 azureStorage로 설정 | None | yes | | uris | 수집할 Azure 객체가 있는 URI의 JSON 배열. 형식: azureStorage://STORAGE_ACCOUNT/CONTAINER/PATH_TO_FILE | None | uris, prefixes, objects 중 하나를 반드시 설정 | | prefixes | 수집할 Azure 객체 위치의 URI 접두사 JSON 배열. 형식 azureStorage://STORAGE_ACCOUNT/CONTAINER/PREFIX. 주어진 접두사 중 하나로 시작하는 빈 객체는 건너뜀 | None | uris, prefixes, objects 중 하나를 반드시 설정 | | objects | 수집할 Azure 객체 JSON 배열 | None | uris, prefixes, objects 중 하나를 반드시 설정 | | objectGlob | Azure URI의 객체 부분에 대한 glob. URI azureStorage://foo/bar/file.json에서 glob은 bar/file.json에 적용됨. glob은 파일 이름뿐 아니라 객체 부분 전체와 일치해야 함. 예를 들어 glob *.json은 azureStorage://foo/bar/file.json과 일치하지 않는데, 객체 부분이 bar/file.json이라 *가 슬래시와 일치하지 않기 때문. .json으로 끝나는 모든 객체와 일치시키려면 대신 **.json을 사용. 자세한 내용은 FileSystem#getPathMatcher 문서 참고 | None | no | | systemFields | 입력 행의 일부로 반환할 시스템 필드 JSON 배열. 가능한 값: __file_uri(azureStorage://로 시작하는 Azure blob URI), __file_bucket(Azure 버킷), __file_path(Azure 객체 경로) | None | no | | properties | 기본 Azure 구성을 재정의하는 Properties 객체. 자세한 내용은 아래 참고 | None | No (제공하지 않으면 기본값 사용) |

Azure input source는 prefixes가 지정된 경우에만 모든 빈 객체를 건너뜁니다.

objects 속성은 다음 중 하나일 수 있어요.

| Property | Description | Default | Required | | bucket | Azure Blob Storage 또는 Azure Data Lake 저장소 계정 이름 | None | yes | | path | 데이터가 있는 컨테이너와 경로 | None | yes |

properties 속성은 다음 중 하나일 수 있어요.

  • sharedAccessStorageToken
  • key
  • appRegistrationClientId, appRegistrationClientSecret, tenantId
  • empty

| Property | Description | Default | Required | | sharedAccessStorageToken | 이 Azure Blob Storage 공유 액세스 토큰의 평문 문자열 | None | No | | key | Azure Blob Storage 계정의 루트 키 | None | no | | appRegistrationClientId | 인증할 Azure App 등록의 클라이언트 ID | None | No | | appRegistrationClientSecret | 인증할 Azure App 등록의 클라이언트 시크릿 | None | appRegistrationClientId가 제공되면 Yes | | tenantId | 인증할 Azure App 등록의 테넌트 ID | None | appRegistrationClientId가 제공되면 Yes |

레거시 azure input source

azure 타입을 사용하는 Azure input source는 Azure input 타입의 이전 버전이며 권장되지 않습니다. 어떤 저장소 계정에서 수집할지 지정하는 것을 지원하지 않아요. 더 많은 기능을 제공하는 azureStorage input source 스키마를 사용할 것을 권장합니다.

샘플 스펙:

...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "azure",        "objectGlob": "**.json",        "uris": ["azure://container/prefix1/file.json", "azure://container/prefix2/file2.json"]      },      "inputFormat": {        "type": "json"      },      ...    },...
...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "azure",        "objectGlob": "**.parquet",        "prefixes": ["azure://container/prefix1/", "azure://container/prefix2/"]      },      "inputFormat": {        "type": "json"      },      ...    },...
...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "azure",        "objectGlob": "**.json",        "objects": [          { "bucket": "container", "path": "prefix1/file1.json"},          { "bucket": "container", "path": "prefix2/file2.json"}        ]      },      "inputFormat": {        "type": "json"      },      ...    },...

| Property | Description | Default | Required | | type | 값을 azure로 설정 | None | yes | | uris | 수집할 Azure 객체가 있는 URI의 JSON 배열, 형식 azure://<container>/<path-to-file> | None | uris 또는 prefixes 또는 objects 중 하나를 설정해야 함 | | prefixes | 수집할 Azure 객체 위치의 URI 접두사 JSON 배열, 형식 azure://<container>/<prefix>. 주어진 접두사 중 하나로 시작하는 빈 객체는 건너뜀 | None | uris 또는 prefixes 또는 objects 중 하나를 설정해야 함 | | objects | 수집할 Azure 객체 JSON 배열 | None | uris 또는 prefixes 또는 objects 중 하나를 설정해야 함 | | objectGlob | Azure URI의 객체 부분에 대한 glob. URI azure://foo/bar/file.json에서 glob은 bar/file.json에 적용됨. glob은 파일 이름뿐 아니라 객체 부분 전체와 일치해야 함. 예를 들어 glob *.json은 azure://foo/bar/file.json과 일치하지 않는데, 객체 부분이 bar/file.json이라 *가 슬래시와 일치하지 않기 때문. .json으로 끝나는 모든 객체와 일치시키려면 대신 **.json을 사용. 자세한 내용은 FileSystem#getPathMatcher 문서 참고 | None | no | | systemFields | 입력 행의 일부로 반환할 시스템 필드 JSON 배열. 가능한 값: __file_uri(azure://로 시작하는 Azure blob URI), __file_bucket(Azure 버킷), __file_path(Azure 객체 경로) | None | no |

Azure input source는 prefixes가 지정된 경우에만 모든 빈 객체를 건너뜁니다.

objects 속성은 다음과 같습니다.

| Property | Description | Default | Required | | bucket | Azure Blob Storage 또는 Azure Data Lake 컨테이너 이름 | None | yes | | path | 데이터가 있는 경로 | None | yes |

HDFS input source

필수 확장

HDFS input source를 사용하려면 common.runtime.properties 파일에 확장 druid-hdfs-storage을 로드하세요.

HDFS input source는 HDFS 스토리지에서 파일을 직접 읽는 것을 지원해요. 파일 경로는 HDFS URI 문자열 또는 HDFS URI 문자열 목록으로 지정할 수 있습니다. HDFS input source는 분할 가능하며 parallel task에서 사용할 수 있는데, index_parallel의 각 worker task가 하나 또는 여러 파일을 읽습니다.

샘플 스펙:

...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "hdfs",        "paths": "hdfs://namenode_host/foo/bar/", "hdfs://namenode_host/bar/foo"      },      "inputFormat": {        "type": "json"      },      ...    },...
...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "hdfs",        "paths": "hdfs://namenode_host/foo/bar/", "hdfs://namenode_host/bar/foo"      },      "inputFormat": {        "type": "json"      },      ...    },...
...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "hdfs",        "paths": "hdfs://namenode_host/foo/bar/file.json", "hdfs://namenode_host/bar/foo/file2.json"      },      "inputFormat": {        "type": "json"      },      ...    },...
...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "hdfs",        "paths": ["hdfs://namenode_host/foo/bar/file.json", "hdfs://namenode_host/bar/foo/file2.json"]      },      "inputFormat": {        "type": "json"      },      ...    },...

| Property | Description | Default | Required | | type | 값을 hdfs로 설정 | None | yes | | paths | HDFS 경로. JSON 배열 또는 쉼표로 구분된 경로 문자열일 수 있음. * 같은 와일드카드가 이 경로에서 지원됨. 주어진 경로 중 하나 아래에 있는 빈 파일은 건너뜀 | None | yes | | systemFields | 입력 행의 일부로 반환할 시스템 필드 JSON 배열. 가능한 값: __file_uri(URI)와 __file_path(URI의 경로 컴포넌트) | None | no |

HDFS 클라이언트가 그 스토리지를 지원한다면, HDFS input source로 다른 스토리지에서도 수집할 수 있어요. 다만 클라우드 스토리지에서 수집하려면 데이터 스토리지에 특화된 서비스 input source 사용을 고려하세요. HDFS input source와 함께 non-hdfs 프로토콜을 사용하려면 druid.ingestion.hdfs.allowedProtocols에 그 프로토콜을 포함하세요. 자세한 내용은 HDFS input source security configuration 참고.

HTTP input source

HTTP input source는 HTTP를 통해 원격 사이트에서 파일을 직접 읽는 것을 지원해요.

보안 참고 사항

수집 태스크는 Druid 프로세스(예: Indexer, Middle Manager, Peon)를 실행하는 운영 체제 계정으로 실행됩니다. 즉 수집 태스크를 제출할 수 있는 사용자는 Druid 프로세스가 접근할 수 있는 어떤 위치든 참조하는 input source를 지정할 수 있다는 뜻이에요. 예를 들어 http input source를 사용하면 사용자가 내부 네트워크 서버에 접근할 수 있습니다.

http input source는 HTTP 또는 HTTPS 프로토콜로 제한되지 않습니다. 기본적으로 HTTP, HTTPS, FTP, file, jar 프로토콜을 지원하는 Java URI 클래스를 사용해요.

보안 모범 사례에 대한 자세한 내용은 Security overview를 참고하세요.

HTTP input source는 분할 가능하며 parallel task에서 사용할 수 있는데, index_parallel의 각 worker task가 오직 하나의 파일만 읽습니다. 이 input source는 Split Hint Spec을 지원하지 않아요.

샘플 스펙:

...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "http",        "uris": ["http://example.com/uri1", "http://example2.com/uri2"]      },      "inputFormat": {        "type": "json"      },      ...    },...

DefaultPassword provider를 사용한 인증 필드 예시(비밀번호가 ingestion spec에 있어야 함):

...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "http",        "uris": ["http://example.com/uri1", "http://example2.com/uri2"],        "httpAuthenticationUsername": "username",        "httpAuthenticationPassword": "password123"      },      "inputFormat": {        "type": "json"      },      ...    },...

다른 기존 Druid PasswordProvider를 사용할 수도 있습니다. EnvironmentVariablePasswordProvider를 사용한 예시:

...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "http",        "uris": ["http://example.com/uri1", "http://example2.com/uri2"],        "httpAuthenticationUsername": "username",        "httpAuthenticationPassword": {          "type": "environment",          "variable": "HTTP_INPUT_SOURCE_PW"        }      },      "inputFormat": {        "type": "json"      },      ...    },...}

| Property | Description | Default | Required | | type | 값을 http로 설정 | None | yes | | uris | 입력 파일의 URI. URI에 허용되는 프로토콜은 아래 참고 | None | yes | | httpAuthenticationUsername | 지정된 URI로 인증하는 데 사용할 사용자 이름. 스펙에 지정된 URI가 Basic Authentication Header를 요구하면 선택적으로 사용 가능 | None | no | | httpAuthenticationPassword | 지정된 URI와 함께 사용할 PasswordProvider. 스펙에 지정된 URI가 Basic Authentication Header를 요구하면 선택적으로 사용 가능 | None | no | | systemFields | 입력 행의 일부로 반환할 시스템 필드 JSON 배열. 가능한 값: __file_uri(스킴을 포함한 URI)와 __file_path(URI의 경로 컴포넌트) | None | no |

HTTP input source로는 druid.ingestion.http.allowedProtocols 속성에 나열된 프로토콜만 사용할 수 있어요. http와 https 프로토콜은 기본적으로 허용됩니다. 자세한 내용은 HTTP input source security configuration 참고.

Inline input source

Inline input source는 자신의 스펙 안에 인라인된 데이터를 읽는 데 사용할 수 있어요. 데모나 파싱·스키마를 빠르게 테스트할 때 사용할 수 있습니다.

샘플 스펙:

...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "inline",        "data": "0,values,formatted\n1,as,CSV"      },      "inputFormat": {        "type": "csv"      },      ...    },...

| Property | Description | Required | | type | 값을 inline으로 설정 | yes | | data | 수집할 인라인 데이터 | yes |

Local input source

Local input source는 로컬 스토리지에서 파일을 직접 읽는 것을 지원하며, 주로 개념 증명(proof-of-concept) 테스트를 위해 마련됐어요. Local input source는 분할 가능하며 parallel task에서 사용할 수 있는데, index_parallel의 각 worker task가 하나 또는 여러 파일을 읽습니다.

샘플 스펙:

...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "local",        "filter" : "*.csv",        "baseDir": "/data/directory",        "files": ["/bar/foo", "/foo/bar"]      },      "inputFormat": {        "type": "csv"      },      ...    },...

| Property | Description | Required | | type | 값을 local로 설정 | yes | | filter | 파일에 대한 와일드카드 필터. 자세한 내용은 여기 참고. 필터 기준과 일치하는 파일이 수집 후보가 됨. 필터 기준과 일치하지 않는 파일은 무시됨 | baseDir가 지정되면 yes | | baseDir | 수집할 파일을 재귀적으로 검색할 디렉토리. baseDir 아래의 빈 파일은 건너뜀 | baseDir 또는 files 중 적어도 하나는 지정해야 함 | | files | 수집할 파일 경로. 지정된 baseDir 아래에 있어 중복 수집을 피하려면 일부 파일은 무시될 수 있음. 빈 파일은 건너뜀 | baseDir 또는 files 중 적어도 하나는 지정해야 함 | | systemFields | 입력 행의 일부로 반환할 시스템 필드 JSON 배열. 가능한 값: __file_uri(file:로 시작하는 파일 URI)와 __file_path(파일 경로) | no |

Druid input source

Druid input source는 기존 Druid 세그먼트에서 데이터를 직접 읽는 것을 지원하며, 잠재적으로 새 스키마를 사용하고 세그먼트의 이름·dimension·metric·rollup 등을 바꿀 수 있어요. Druid input source는 분할 가능하며 parallel task에서 사용할 수 있습니다. 이 input source는 Druid 세그먼트에서 읽는 고정 input format을 가지므로, 이 input source를 사용할 때는 ingestion spec에 inputFormat 필드를 지정할 필요가 없습니다.

| Property | Description | Required | | type | 값을 druid로 설정 | yes | | dataSource | 행을 가져올 Druid datasource를 정의하는 String | yes | | interval | 데이터를 가져올 시간 범위를 정의하는 ISO-8601 interval을 나타내는 String | yes | | filter | Filters 참고. 필터가 지정되면 매칭되는 행만 반환됨 | no |

Druid input source는 다양한 목적으로 사용할 수 있어요.

  • 기존 datasource의 롤업된 복사본인 새 datasource 만들기
  • 성능 향상을 위해 datasource의 파티셔닝 또는 정렬 변경
  • transformSpec으로 행 업데이트·제거

Druid input source를 사용할 때 타임스탬프 컬럼은 epoch(1970년 1월 1일 00:00:00 UTC) 이후 밀리초 수로 설정된 __time이라는 숫자 필드로 나타납니다. 출력 타임스탬프가 입력 타임스탬프와 동일하게 하고 싶다면, timestampSpec에서 이를 사용하는 것이 일반적이에요. 이 경우 타임스탬프 컬럼을 __time으로, 형식을 auto 또는 millis로 설정하세요.

입력과 출력 datasource가 같아도 괜찮습니다. 이 경우 새로 생성된 데이터가 granularitySpec에 지정된 interval의 이전 데이터를 덮어써요. 일반적으로 이렇게 할 거라면, 메인 datasource를 덮어쓰기 전에 별도 datasource에 써서 재인덱싱을 미리 테스트하는 것이 좋아요. 또는 목표가 컴팩션으로 충족될 수 있다면, 더 간단한 접근으로 컴팩션을 고려해 보세요.

아래는 예시 태스크 스펙입니다. 가상의 원시 datasource wikipedia_raw에서 읽고, hour, "countryName", "page"로 그룹화해서 새로 롤업된 datasource wikipedia_rollup을 만듭니다.

{  "type": "index_parallel",  "spec": {    "dataSchema": {      "dataSource": "wikipedia_rollup",      "timestampSpec": {        "column": "__time",        "format": "millis"      },      "dimensionsSpec": {        "dimensions": [          "countryName",          "page"        ]      },      "metricsSpec": [        {          "type": "count",          "name": "cnt"        }      ],      "granularitySpec": {        "type": "uniform",        "queryGranularity": "HOUR",        "segmentGranularity": "DAY",        "intervals": ["2016-06-27/P1D"],        "rollup": true      }    },    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "druid",        "dataSource": "wikipedia_raw",        "interval": "2016-06-27/P1D"      }    },    "tuningConfig": {      "type": "index_parallel",      "partitionsSpec": {        "type": "hashed"      },      "forceGuaranteedRollup": true,      "maxNumConcurrentSubTasks": 1    }  }}

정보

이전 버전(0.19 및 그 이전)은 Druid input source를 사용할 때 timestampSpec을 존중하지 않았어요. 이에 의존하는 ingestion spec이 있고 다시 작성할 수 없다면, druid.indexer.task.ignoreTimestampSpecForDruidInputSource를 true로 설정해서 timestampSpec이 무시되는 호환성 모드를 활성화하세요.

보조 파티셔닝 방법이 Combining input source로 수집을 완료하기 위해 병렬로 실행되는 동시 worker task의 필수 수를 결정해요. tuningConfig의 maxNumConcurrentSubTasks에 이 값을 보조 파티셔닝 방법에 따라 설정하세요.

  • range 또는 single_dim 파티셔닝: 1 이상
  • hashed 또는 dynamic 파티셔닝: 2 이상

maxNumConcurrentSubTasks 필드에 대한 자세한 내용은 Implementation considerations를 참고하세요.

SQL input source

필수 확장

SQL input source를 사용하려면 common.runtime.properties 파일에 적절한 확장을 로드해야 합니다.

  • MySQL에 연결하려면 확장 mysql-metadata-storage 로드.
  • PostgreSQL에 연결하려면 확장 postgresql-metadata-storage 로드.

MySQL 확장은 JDBC 드라이버가 필요해요. 자세한 내용은 Installing the MySQL connector library를 참고하세요.

SQL input source는 RDBMS에서 데이터를 직접 읽는 데 사용됩니다. SQL input source의 수집 태스크를 분할할 수 있어요. 병렬 태스크 타입을 사용하면 각 worker task가 쿼리 목록 중 하나의 SQL 쿼리에서 읽습니다. 이 input source는 Split Hint Spec을 지원하지 않습니다.

SQL input source는 이벤트를 읽는 고정 input format을 가져요. 이 input source를 사용할 때는 inputFormat을 지정하지 마세요.

이 input source를 사용하기 전에 권장 사항(아래)을 참고하세요.

| Property | Description | Required | | type | 값을 sql로 설정 | Yes | | database | 데이터베이스 연결 정보 지정. database 타입은 connectorConfig 지원을 제공하는 확장에 해당함. connectURI에서 JDBC 속성을 선택적으로 허용할 수 있음. 자세한 내용은 JDBC connections security config 참고 | Yes | | foldCase | 데이터베이스 컬럼 이름의 대소문자 접기에 대한 Boolean 토글. 예를 들어 Entry_Date라는 데이터베이스 컬럼을 entry_date로 수집하려면 foldCase를 true로 설정하고 dimensionsSpec에 entry_date를 포함 | No | | sqls | 각 SQL 쿼리가 인덱싱할 데이터를 검색하는 SQL 쿼리 목록 | Yes |

다음은 SQL input source 스펙의 예시입니다.

...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "sql",        "database": {            "type": "mysql",            "connectorConfig": {                "connectURI": "jdbc:mysql://host:port/schema",                "user": "user",                "password": "password"            }        },        "sqls": ["SELECT * FROM table1 WHERE timestamp BETWEEN '2013-01-01 00:00:00' AND '2013-01-01 11:59:59'", "SELECT * FROM table2 WHERE timestamp BETWEEN '2013-01-01 00:00:00' AND '2013-01-01 11:59:59'"]      }    },...

위 스펙은 2013-01-01/2013-01-02 interval에 대해 두 개의 서로 다른 SQL에서 모든 이벤트를 읽습니다. 각 SQL 쿼리는 자신만의 서브-태스크에서 실행되므로, 위 예시에서는 서브-태스크가 두 개가 됩니다.

다른 네이티브 배치 input source와 비교해 SQL input source는 입력 데이터를 읽는 방식이 다르게 동작해요. 따라서 이 input source를 프로덕션 환경에서 사용하기 전에 다음 사항을 고려하세요.

  • 인덱싱 중 각 서브-태스크가 SQL 쿼리 중 하나를 실행하고 결과는 로컬 디스크에 저장됩니다. 그다음 서브-태스크는 이 로컬 입력 파일에서 데이터를 읽고 세그먼트를 생성합니다. 현재 생성된 파일의 크기에 대한 제한은 없어서, 인덱싱되는 데이터 양에 따라 Middle Manager나 Indexer가 충분한 디스크 용량을 가져야 합니다.
  • granularitySpec에 지정된 interval에 기반해 SQL 쿼리를 필터링하면 원치 않는 데이터가 수집 서브-태스크에 의해 검색·로컬 저장되는 것을 피할 수 있어요. 예를 들어 granularitySpec에 지정된 intervals가 ["2013-01-01/2013-01-02"]이고 SQL 쿼리가 SELECT * FROM table1이라면, SqlInputSource는 지정된 interval 사이의 데이터만 Druid에 인덱싱되더라도 쿼리에 기반해 table1의 모든 데이터를 읽습니다.
  • 페이지네이션을 SQL 쿼리에 사용하면 각 쿼리가 비슷한 양의 데이터를 가져오게 되어 서브-태스크의 효율을 높일 수 있어요.
  • 파일 기반 input format과 유사하게, 기존 데이터에 대한 어떤 업데이트도 granularitySpec에 지정된 interval에 특화된 세그먼트의 데이터를 대체할 것입니다.

Combining input source

Combining input source는 여러 input source에서 데이터를 읽을 수 있게 해 줍니다. 위임(delegate) input source들에서 분할(split)을 식별하고 각 분할을 처리하는 데 worker task를 사용합니다. 각 위임 input source는 분할 가능해야 하고 병렬 태스크 타입과 호환되어야 해요.

다른 input source와 유사하게, Combining input source는 단일 inputFormat을 지원합니다. inputFormat이 필요한 위임 input source는 입력 데이터에 같은 형식을 가져야 합니다. Druid input source를 포함하면 타임스탬프 컬럼이 __time 필드에 저장됩니다. Druid input source의 데이터를 다른 소스와 올바르게 결합하려면, 다른 위임 input source들도 타임스탬프 컬럼을 __time에 저장하는지 확인하세요.

| Property | Description | Required | | type | 값을 combining으로 설정 | Yes | | delegates | 데이터를 읽을 분할 가능한 input source 목록 | Yes |

다음은 Combining input source 스펙의 예시입니다.

...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "combining",        "delegates" : [         {          "type": "local",          "filter" : "*.csv",          "baseDir": "/data/directory",          "files": ["/bar/foo", "/foo/bar"]         },         {          "type": "druid",          "dataSource": "wikipedia",          "interval": "2013-01-01/2013-01-02"         }        ]      },      "inputFormat": {        "type": "csv"      },      ...    },...

Iceberg input source

필수 확장

Iceberg input source를 사용하려면 common.runtime.properties 파일에 확장 druid-iceberg-extensions을 로드하세요.

Iceberg input source를 사용해서 Iceberg 테이블 형식으로 저장된 데이터를 읽습니다. 주어진 테이블에 대해 input source는 구성된 Hive 카탈로그에서 최신 Iceberg 스냅샷까지 스캔합니다. Druid는 기존 input source 형식을 사용해서 기저의 라이브 데이터 파일들을 수집합니다.

Iceberg input source는 데이터 파일을 읽기 위해 기존 input source에 의존하므로 독립적일 수 없어요. 예를 들어 Iceberg 카탈로그와 연관된 웨어하우스가 S3에 있다면 druid-s3-extensions 확장도 로드해야 합니다.

다음은 HDFS 웨어하우스 소스에 대한 샘플 스펙입니다.

...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "iceberg",        "tableName": "iceberg_table",        "namespace": "iceberg_namespace",        "icebergCatalog": {            "type": "hive",            "warehousePath": "hdfs://warehouse/path",            "catalogUri": "thrift://hive-metastore.x.com:8970",            "catalogProperties": {                "hive.metastore.connect.retries": "1",                "hive.metastore.execute.setugi": "false",                "hive.metastore.kerberos.principal": "KRB_PRINCIPAL",                "hive.metastore.sasl.enabled": "true",                "metastore.catalog.default": "catalog_test",                "hadoop.security.authentication": "kerberos",                "hadoop.security.authorization": "true"            }        },        "icebergFilter": {            "type": "interval",            "filterColumn": "event_time",            "intervals": [              "2023-05-10T19:00:00.000Z/2023-05-10T20:00:00.000Z"            ]        },        "warehouseSource": {            "type": "hdfs"        },        "snapshotTime": "2023-06-01T00:00:00.000Z",      },      "inputFormat": {        "type": "parquet"      }  },      ...},...

다음은 S3 웨어하우스 소스에 대한 샘플 스펙입니다.

...        "ioConfig": {          "type": "index_parallel",          "inputSource": {            "type": "iceberg",            "tableName": "iceberg_table",            "namespace": "iceberg_namespace",            "icebergCatalog": {              "type": "hive",              "warehousePath": "s3://warehouse/path",              "catalogUri": "thrift://hive-metastore.x.com:8970",              "catalogProperties": {                "hive.metastore.connect.retries": "1",                "hive.metastore.execute.setugi": "false",                "hive.metastore.kerberos.principal": "KRB_PRINCIPAL",                "hive.metastore.sasl.enabled": "true",                "metastore.catalog.default": "default_catalog",                "fs.s3a.access.key" : "S3_ACCESS_KEY",                "fs.s3a.secret.key" : "S3_SECRET_KEY",                "fs.s3a.endpoint" : "S3_API_ENDPOINT"              }            },            "icebergFilter": {              "type": "interval",              "filterColumn": "event_time",              "intervals": [                "2023-05-10T19:00:00.000Z/2023-05-10T20:00:00.000Z"              ]            },            "warehouseSource": {              "type": "s3",              "endpointConfig": {                "url": "teststore.aws.com",                "signingRegion": "us-west-2a"              },              "clientConfig": {                "protocol": "http",                "disableChunkedEncoding": true,                "enablePathStyleAccess": true,                "forceGlobalBucketAccessEnabled": false              },              "properties": {                "accessKeyId": {                  "type": "default",                  "password": "foo"                },                "secretAccessKey": {                  "type": "default",                  "password": "bar"                }              },            }          },          "inputFormat": {            "type": "parquet"          }        },...},

| Property | Description | Required | | type | 값을 iceberg로 설정 | yes | | tableName | 카탈로그에 구성된 Iceberg 테이블 이름 | yes | | namespace | 테이블과 연관된 Iceberg 네임스페이스 | yes | | icebergFilter | 스냅샷 안의 데이터 파일을 필터링하는 JSON Object | no | | icebergCatalog | 구성된 Iceberg 테이블을 관리하는 카탈로그를 정의하는 JSON Object | yes | | warehouseSource | 웨어하우스에서 데이터 파일을 읽기 위한 네이티브 input source를 정의하는 JSON Object | yes | | snapshotTime | 이 시점 기준으로 가장 최근 스냅샷을 가져오는 데 사용할 ISO8601 DateTime 형식의 타임스탬프 | no | | residualFilterMode | 필터 결과가 잔여(residual)를 낼 때 잔여 필터가 처리되는 방식을 제어. 이는 보통 Iceberg 필터가 비-파티션 컬럼을 대상으로 할 때 발생: 파일이 필터와 일치하지 않는 행(잔여 행)을 포함할 수 있음. 유효한 값: ignore(기본, 모든 행을 수집하고 경고 로깅), fail(수집 작업 실패). transformSpec에 필터가 없다면 초과 데이터가 수집되지 않도록 보장하려면 fail을 사용 | no |

Catalog Object

catalog 객체는 rest, hive, glue, local 카탈로그 타입을 지원합니다.

다음 표는 local 카탈로그의 속성을 나열합니다.

| Property | Description | Default | Required | | type | 이 값을 local로 설정 | None | yes | | warehousePath | 카탈로그와 연관된 웨어하우스의 위치 | None | yes | | catalogProperties | 카탈로그에 부착해야 하는 추가 속성의 맵 | None | no | | caseSensitive | Iceberg 테이블 읽기 중 컬럼 이름의 대소문자 구분 토글 | true | no |

다음 표는 hive 카탈로그의 속성을 나열합니다.

| Property | Description | Default | Required | | type | 이 값을 hive로 설정 | None | yes | | warehousePath | 카탈로그와 연관된 웨어하우스의 위치 | None | yes | | catalogUri | hive 카탈로그와 연관된 URI | None | yes | | catalogProperties | 카탈로그에 부착해야 하는 추가 속성의 맵 | None | no | | caseSensitive | Iceberg 테이블 읽기 중 컬럼 이름의 대소문자 구분 토글 | true | no |

다음 표는 rest 카탈로그의 속성을 나열합니다.

| Property | Description | Default | Required | | type | 이 값을 rest로 설정 | None | yes | | catalogUri | 카탈로그의 HTTP 엔드포인트와 연관된 URI | None | yes | | catalogProperties | 카탈로그에 부착해야 하는 추가 속성의 맵 | None | no |

다음 표는 glue 카탈로그의 속성을 나열합니다.

| Property | Description | Default | Required | | type | 이 값을 glue로 설정 | None | yes | | catalogProperties | 카탈로그에 부착해야 하는 추가 속성의 맵. Iceberg Catalog configuration 문서의 모든 구성이 필요 | None | Yes |

샘플:

..."icebergCatalog":{     "type": "glue",    "catalogProperties":    {        "warehouse": "s3a://bucket/warehouse",        "io-impl": "org.apache.iceberg.aws.s3.S3FileIO"    }}..

Iceberg filter object

이 input source는 and, equals, interval, timeWindow, range, or 필터를 제공합니다. 이 필터들을 사용해서 스냅샷에서 데이터 파일을 걸러낼 수 있으며, Druid가 수집해야 하는 파일 수를 줄여 줍니다. 필터링은 Iceberg 파티션 컬럼에만 적용할 것을 강력히 권장해요. 비-파티션 컬럼에서 필터링할 때 Iceberg 필터는 표현식과 완전히 일치하지 않는 행을 반환할 수 있습니다. 이를 해결하려면 transformSpec에서 추가 필터를 정의해서 잔여 행을 제거하는 것이 도움이 될 수 있습니다.

equals Filter:

| Property | Description | Required | | type | 이 값을 equals로 설정 | yes | | filterColumn | 필터링에 사용할 Iceberg 테이블 스키마의 컬럼 이름 | yes | | filterValue | 필터링할 값 | yes |

interval Filter:

| Property | Description | Required | | type | 이 값을 interval로 설정 | yes | | filterColumn | 필터링이 일어나야 하는 iceberg 테이블 스키마의 컬럼 이름 | yes | | intervals | ISO 8601 interval 문자열을 담은 JSON 배열. 필터링할 시간 범위를 정의. 시작 interval은 포함이고 끝 interval은 제외 | yes |

and Filter:

| Property | Description | Required | | type | 이 값을 and로 설정 | yes | | filters | AND 연산해야 하는 iceberg 필터 목록 | yes |

or Filter:

| Property | Description | Required | | type | 이 값을 or로 설정 | yes | | filters | OR 연산해야 하는 iceberg 필터 목록 | yes |

not Filter:

| Property | Description | Required | | type | 이 값을 not으로 설정 | yes | | filter | 논리적 NOT이 적용되는 iceberg 필터 | yes |

range Filter:

| Property | Description | Default | Required | | type | 이 값을 range로 설정 | None | yes | | filterColumn | range 필터링이 일어나야 하는 iceberg 테이블 스키마의 컬럼 이름 | None | yes | | lower | 일치시킬 하한 값 | None | no. lower 또는 upper 중 적어도 하나는 null이 아니어야 함 | | upper | 일치시킬 상한 값 | None | no. lower 또는 upper 중 적어도 하나는 null이 아니어야 함 | | lowerOpen | range에 의해 정의된 값 interval에서 하한이 개방인지(open)를 나타내는 Boolean(>= 대신 >) | false | no | | upperOpen | range에 의해 정의된 값 interval에서 상한이 개방인지 여부를 나타내는 Boolean(<= 대신 <) | false | no |

timeWindow Filter:

| Property | Description | Default | Required | | type | 이 값을 timeWindow로 설정 | None | yes | | filterColumn | 필터링이 일어나야 하는 iceberg 테이블 스키마의 컬럼 이름. 필터 컬럼은 Iceberg에서 TimestampType으로 정의되어야 함 | None | yes | | baseTime | 시간 윈도우를 정의하기 위해 lookback·lookahead 기간이 적용되는 기준 타임스탬프를 결정 | 현재 UTC 타임스탬프 | no | | lookbackDuration | 필터가 baseTime 기준으로 얼마나 뒤로 데이터를 포함해야 하는지를 결정하는 기간 정의 | P1D | no | | lookaheadDuration | 필터가 baseTime 기준으로 얼마나 앞으로 데이터를 포함해야 하는지를 결정하는 기간 정의 | Zero | no |

Delta Lake input source

필수 확장

Delta Lake input source를 사용하려면 common.runtime.properties 파일에 확장 druid-deltalake-extensions을 로드하세요.

Delta input source를 사용해서 Delta Lake 테이블에 저장된 데이터를 읽을 수 있어요. 주어진 테이블에 대해 input source는 구성된 테이블의 최신 스냅샷을 스캔합니다. Druid는 테이블의 기저 delta 파일들을 수집합니다.

| Property | Description | Default | Required | | type | 이 값을 delta로 설정 | None | yes | | tablePath | Delta 테이블의 위치 | None | yes | | filter | 스냅샷 안의 데이터 파일을 필터링하는 JSON Object | None | no | | snapshotVersion | Delta 테이블에서 읽을 스냅샷 버전. 정수 값이 지정되어야 함 | Latest | no |

Delta filter object

이 필터들을 사용해서 스냅샷에서 데이터 파일을 걸러낼 수 있으며, Druid가 Delta 테이블에서 수집해야 하는 파일 수를 줄여 줍니다. 이 input source는 and, or, not, =, >, >=, <, <= 필터를 제공합니다.

비-파티션 컬럼에 필터가 적용되면, Delta Kernel이 비-파티션 테이블 생성 시 수집된 통계에만 전적으로 의존하므로 필터링은 최선(best-effort)이 됩니다. 이 시나리오에서 이 Druid 커넥터는 필터와 일치하지 않는 데이터를 수집할 수 있어요. Delta Kernel이 불필요한 컬럼 값을 확실히 제거하려면 파티션 컬럼에만 필터를 사용하세요.

and filter:

| Property | Description | Required | | type | 이 값을 and로 설정 | yes | | filters | 두 조건이 모두 참이어야 하는 논리적 AND로 평가되는 Delta filter predicate 목록. and 필터는 두 개의 filter predicate를 요구함 | yes |

or filter:

| Property | Description | Required | | type | 이 값을 or로 설정 | yes | | filters | 한 조건만 참이면 되는 논리적 OR로 평가되는 Delta filter predicate 목록. or 필터는 두 개의 filter predicate를 요구함 | yes |

not filter:

| Property | Description | Required | | type | 이 값을 not으로 설정 | yes | | filter | 논리적 NOT으로 평가되는 Delta filter predicate. not 필터는 하나의 filter predicate를 요구함 | yes |

= filter:

| Property | Description | Required | | type | 이 값을 =로 설정 | yes | | column | 필터를 적용할 테이블 컬럼 | yes | | value | 필터에 사용할 값 | yes |

> filter:

| Property | Description | Required | | type | 이 값을 >로 설정 | yes | | column | 필터를 적용할 테이블 컬럼 | yes | | value | 필터에 사용할 값 | yes |

>= filter:

| Property | Description | Required | | type | 이 값을 >=로 설정 | yes | | column | 필터를 적용할 테이블 컬럼 | yes | | value | 필터에 사용할 값 | yes |

< filter:

| Property | Description | Required | | type | 이 값을 <로 설정 | Yes | | column | 필터를 적용할 테이블 컬럼 | Yes | | value | 필터에 사용할 값 | Yes |

<= filter:

| Property | Description | Required | | type | 이 값을 <=로 설정 | yes | | column | 필터를 적용할 테이블 컬럼 | yes | | value | 필터에 사용할 값 | yes |

Delta 테이블 /delta-table/foo의 최신 스냅샷에서 모든 레코드를 읽는 샘플 스펙:

...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "delta",        "tablePath": "/delta-table/foo"      },    }

Delta 테이블 /delta-table/foo의 스냅샷 버전 3에서 name = 'Employee4' and age >= 30인 레코드를 선택해서 읽는 샘플 스펙:

...    "ioConfig": {      "type": "index_parallel",      "inputSource": {        "type": "delta",        "tablePath": "/delta-table/foo",        "filter": {          "type": "and",          "filters": [            {             "type": "=",             "column": "name",             "value": "Employee4"            },            {              "type": ">=",              "column": "age",              "value": "30"            }          ]        },       "snapshotVersion":  3      },    }

더 알아보기 (Learn more)