

# JDBC 연결
<a name="aws-glue-programming-etl-connect-jdbc-home"></a>

 일반적으로 특정 관계형 데이터베이스 유형은 JDBC 표준을 통한 연결을 지원합니다. JDBC에 대한 자세한 내용은 [Java JDBC API](https://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/) 설명서를 참조하세요. AWS Glue는 기본적으로 JDBC 커넥터를 통해 특정 데이터베이스 연결을 지원합니다. JDBC 라이브러리는 AWS Glue Spark 작업에서 제공됩니다. AWS Glue 라이브러리를 사용하여 이러한 데이터베이스 유형에 연결할 때 표준 옵션 세트에 액세스할 수 있습니다.

JDBC connectionType 값은 다음과 같습니다.
+ `"connectionType": "sqlserver"`: Microsoft SQL Server 데이터베이스에 연결을 지정합니다.
+ `"connectionType": "mysql"`: MySQL 데이터베이스에 대한 연결을 지정합니다.
+ `"connectionType": "oracle"`: Oracle Database에 연결을 지정합니다.
+ `"connectionType": "postgresql"`: PostgreSQL 데이터베이스에 대한 연결을 지정합니다.
+ `"connectionType": "redshift"`: Amazon Redshift 데이터베이스에 대한 연결을 지정합니다. 자세한 내용은 [Redshift 연결](aws-glue-programming-etl-connect-redshift-home.md) 섹션을 참조하세요.

다음 표에는 AWS Glue에서 지원하는 JDBC 드라이버 버전 목록이 있습니다.


| 제품 | Glue 5.1용 JDBC 드라이버 버전 | Glue 5.0용 JDBC 드라이버 버전 | Glue 4.0용 JDBC 드라이버 버전 | Glue 3.0용 JDBC 드라이버 버전 | Glue 0.9, 1.0, 2.0용 JDBC 드라이버 버전 | 
| --- | --- | --- | --- | --- | --- | 
| Microsoft SQL Server | 10.2.0 | 10.2.0 | 9.4.0 | 7.x | 6.x | 
| MySQL | 8.0.33 | 8.0.33 | 8.0.23 | 8.0.23 | 5.1 | 
| Oracle Database | 23.3.0.23.09 | 23.3.0.23.09 | 21.7 | 21.1 | 11.2 | 
| PostgreSQL | 42.7.3 | 42.7.3 | 42.3.6 | 42.2.18 | 42.1.x | 
| Amazon Redshift \$1 | redshift-jdbc42-2.1.0.29 | redshift-jdbc42-2.1.0.29 | redshift-jdbc42-2.1.0.16 | redshift-jdbc41-1.2.12.1017 | redshift-jdbc41-1.2.12.1017 | 

\$1 Amazon Redshift 연결 유형의 경우 형식 지정 옵션을 비롯하여 JDBC 연결에 대한 연결 옵션에 포함된 다른 모든 옵션 이름 및 값 페어는 기본 SparkSQL DataSource에 직접 전달됩니다. AWS Glue 4.0 이상 버전의 Spark 작업을 포함하는 AWS Glue에서 Amazon Redshift용 AWS Glue 네이티브 커넥터는 Apache Spark용 Amazon Redshift 통합을 사용합니다. 자세한 내용은 [Apache Spark용 Amazon Redshift 통합](https://docs.aws.amazon.com/redshift/latest/mgmt/spark-redshift-connector.html)을 참조하세요. 이전 버전인 경우 [Amazon Redshift data source for Spark](https://github.com/databricks/spark-redshift)를 참조하세요.

JDBC를 사용하여 Amazon RDS 데이터 스토어에 연결하도록 Amazon VPC를 구성하려면 [AWS Glue에서 Amazon RDS 데이터 스토어에 대해 JDBC를 연결하도록 Amazon VPC 설정](setup-vpc-for-glue-access.md) 섹션을 참조하세요.

**참고**  
AWS Glue 작업은 실행 중에 하나의 서브넷에만 연결됩니다. 이로 인해 동일한 작업을 통해 여러 데이터 소스에 연결하는 기능이 영향을 받을 수 있습니다. 이 동작은 JDBC 소스에만 국한되지 않습니다.

**Topics**
+ [JDBC 연결 옵션 참조](#aws-glue-programming-etl-connect-jdbc)
+ [sampleQuery 사용](#aws-glue-programming-etl-jdbc-samplequery)
+ [사용자 지정 JDBC 드라이버 사용](#aws-glue-programming-etl-jdbc-custom-driver)
+ [JDBC 테이블을 병렬로 읽기](run-jdbc-parallel-read-job.md)
+ [AWS Glue에서 Amazon RDS 데이터 스토어에 대해 JDBC를 연결하도록 Amazon VPC 설정](setup-vpc-for-glue-access.md)

## JDBC 연결 옵션 참조
<a name="aws-glue-programming-etl-connect-jdbc"></a>

이미 JDBC AWS Glue 연결을 정의한 경우 URL, 사용자 및 암호와 같은 JDBC 연결에 정의된 구성 속성을 재사용할 수 있으므로 코드에서 연결 옵션으로 지정할 필요가 없습니다. 이 기능은 AWS Glue 3.0 이상 버전에서 사용할 수 있습니다. 이렇게 하려면 다음 연결 속성을 사용합니다.
+ `"useConnectionProperties"`: 연결에서 구성을 사용하려는 경우 이 값을 'true'로 설정합니다.
+ `"connectionName"`: 구성을 검색할 연결 이름을 입력합니다. 연결은 작업과 동일한 영역에 정의되어 있어야 합니다.

이 연결 옵션을 JDBC 연결에 사용하십시오.
+ `"url"`: (필수) 데이터베이스의 JDBC URL.
+ `"dbtable"`: (필수) 읽을 데이터베이스 테이블입니다. 데이터베이스 내의 스키마를 지원하는 JDBC 데이터 스토어의 경우 `schema.table-name`에 대해 지정합니다. 스키마가 제공되지 않으면 기본 "퍼블릭" 스키마가 사용됩니다.
+ `"user"`: (필수 사항) 연결할 때 사용할 사용자 이름입니다.
+ `"password"`: (필수) 연결할 때 사용할 암호.
+ (선택 사항) 다음 옵션을 사용하면 사용자 정의 JDBC 드라이버를 제공할 수 있습니다. AWS Glue에서 기본적으로 지원하지 않는 드라이버를 사용해야 한다면 이 옵션을 사용합니다.

  ETL 작업은 원본과 대상이 같은 데이터베이스 제품이어도 데이터 원본과 대상에 여러 JDBC 드라이버 버전을 사용할 수 있습니다. 따라서 버전이 다른 원본 데이터베이스와 대상 데이터베이스 간에 데이터를 마이그레이션할 수 있습니다. 이 옵션을 사용하려면 먼저 Amazon S3에 JDBC 드라이버의 JAR 파일을 업로드해야 합니다.
  + `"customJdbcDriverS3Path"`: 사용자 정의 JDBC 드라이버의 Amazon S3 경로입니다.
  + `"customJdbcDriverClassName"`: JDBC 드라이버의 클래스 이름입니다.
+ `"bulkSize"`: (선택 사항) JDBC 대상에 신속하게 대량 로드하기 위해 병렬 삽입을 구성하는 데 사용됩니다. 데이터를 쓰거나 삽입할 때 사용할 병렬 처리 수준의 정수 값을 지정합니다. 이 옵션은 Arch User Repository(AUR)와 같은 데이터베이스에 대한 쓰기 성능을 향상시키는 데 유용합니다.
+ `"hashfield"`(선택 사항) JDBC 테이블에서 병렬로 읽을 때 데이터를 파티션으로 구분하는 데 사용할 JDBC 테이블의 열 이름을 지정하기 위해 사용하는 문자열입니다. 'hashfield' 또는 'hashexpression'을 제공합니다. 자세한 내용은 [JDBC 테이블을 병렬로 읽기](run-jdbc-parallel-read-job.md) 섹션을 참조하세요.
+ `"hashexpression"`(선택 사항) 정수를 반환하는 SQL select 절입니다. JDBC 테이블에서 병렬로 읽을 때 JDBC 테이블의 데이터를 파티션으로 구분하는 데 사용됩니다. 'hashfield' 또는 'hashexpression'을 제공합니다. 자세한 내용은 [JDBC 테이블을 병렬로 읽기](run-jdbc-parallel-read-job.md) 섹션을 참조하세요.
+ `"hashpartitions"`(선택 사항) 양의 정수입니다. JDBC 테이블에서 병렬로 읽을 때 JDBC 테이블의 병렬 읽기 수를 지정하는 데 사용됩니다. 기본값: 7. 자세한 내용은 [JDBC 테이블을 병렬로 읽기](run-jdbc-parallel-read-job.md) 섹션을 참조하세요.
+ `"sampleQuery"`: (선택 사항) 사용자 지정 SQL 쿼리 문입니다. 테이블의 정보 하위 세트를 지정하여 테이블 콘텐츠의 샘플을 검색하는 데 사용됩니다. **데이터를 고려하지 않고 구성하면 DynamicFrame 메서드보다 효율성이 떨어져 시간 초과나 메모리 부족 오류가 발생할 수 있습니다.** 자세한 내용은 [sampleQuery 사용](#aws-glue-programming-etl-jdbc-samplequery) 섹션을 참조하세요.
+ `"enablePartitioningForSampleQuery"`: (선택 사항) 부울입니다. 기본값: false. `sampleQuery`를 지정할 때 JDBC 테이블에서 병렬 읽기를 활성화하는 데 사용됩니다. **true로 설정된 경우 AWS Glue에서 분할 조건을 추가하려면 `sampleQuery`가 'where' 또는 'and'로 끝나야 합니다.** 자세한 내용은 [sampleQuery 사용](#aws-glue-programming-etl-jdbc-samplequery) 섹션을 참조하세요.
+ `"sampleSize"`: (선택 사항) 양의 정수입니다. 샘플 쿼리에서 반환되는 행의 수를 제한합니다. `enablePartitioningForSampleQuery`가 true인 경우에만 작동합니다. 분할이 활성화되지 않은 경우 대신 `sampleQuery`에서 `"limit x"`를 직접 추가하여 크기를 제한해야 합니다. 자세한 내용은 [sampleQuery 사용](#aws-glue-programming-etl-jdbc-samplequery) 섹션을 참조하세요.

## sampleQuery 사용
<a name="aws-glue-programming-etl-jdbc-samplequery"></a>

이 섹션에서는 `sampleQuery`, `enablePartitioningForSampleQuery` 및 `sampleSize` 사용 방법을 설명합니다.

`sampleQuery`는 데이터 세트의 몇 개 행을 샘플링할 때 효율적입니다. 기본적으로 쿼리는 단일 실행기에 의해 실행됩니다. 데이터를 고려하지 않고 구성하면 DynamicFrame 메서드보다 효율성이 떨어져 시간 초과나 메모리 부족 오류가 발생할 수 있습니다. ETL 파이프라인의 일부로 기본 데이터베이스에서 SQL을 실행하는 방법은 일반적으로 성능 목적으로만 필요합니다. 데이터 세트의 몇 개 행을 미리 보려는 경우 [show](aws-glue-api-crawler-pyspark-extensions-dynamic-frame.md#aws-glue-api-crawler-pyspark-extensions-dynamic-frame-show) 사용을 고려합니다. SQL을 사용하여 데이터 세트를 변환하려는 경우 DataFrame 양식의 데이터에 대해 SparkSQL 변환을 정의하는 데 [toDF](aws-glue-api-crawler-pyspark-extensions-dynamic-frame.md#aws-glue-api-crawler-pyspark-extensions-dynamic-frame-toDF) 사용을 고려합니다.

쿼리가 다양한 테이블을 조작할 수 있지만 `dbtable`이 여전히 필요합니다.

**sampleQuery를 사용하여 테이블 샘플 검색**

기본 sampleQuery 동작을 사용하여 데이터 샘플을 검색할 때 AWS Glue는 뛰어난 처리량을 기대하지 않으므로 단일 실행기에서 쿼리를 실행합니다. 제공하는 데이터를 제한하고 성능 문제를 일으키지 않으려면 SQL에 `LIMIT` 절을 제공하는 것이 좋습니다.

**Example 분할 없이 SampleQuery 사용**  
다음 코드 예제에서는 분할 없이 `sampleQuery`를 사용하는 방법을 보여줍니다.  

```
//A full sql query statement.
val query = "select name from $tableName where age > 0 limit 1"
val connectionOptions = JsonOptions(Map(
    "url" -> url, 
    "dbtable" -> tableName, 
    "user" -> user, 
    "password" -> password, 
    "sampleQuery" -> query ))
val dyf = glueContext.getSource("mysql", connectionOptions)
          .getDynamicFrame()
```

**대규모 데이터 세트에서 sampleQuery 사용**

 대규모 데이터 세트를 읽는 경우 JDBC 분할을 활성화하여 테이블을 병렬로 쿼리해야 할 수 있습니다. 자세한 내용은 [JDBC 테이블을 병렬로 읽기](run-jdbc-parallel-read-job.md) 섹션을 참조하세요. JDBC 분할과 함께 `sampleQuery`를 사용하려면 `enablePartitioningForSampleQuery`를 true로 설정합니다. 이 기능을 활성화하려면 `sampleQuery`를 일부 변경해야 합니다.

`sampleQuery`와 함께 JDBC 분할을 사용하는 경우 AWS Glue에서 분할 조건을 추가하려면 쿼리가 'where' 또는 'and'로 끝나야 합니다.

 JDBC 테이블에서 병렬로 읽을 때 sampleQuery의 결과를 제한하려면 `LIMIT` 절을 지정하는 대신, `"sampleSize"` 파라미터를 설정합니다.

**Example JDBC 분할과 함께 sampleQuery 사용**  
다음 코드 예제는 JDBC 분할과 함께 `sampleQuery`를 사용하는 방법을 보여줍니다.  

```
//note that the query should end with "where" or "and" if use with JDBC partitioning.
val query = "select name from $tableName where age > 0 and"

//Enable JDBC partitioning by setting hashfield.
//to use sampleQuery with partitioning, set enablePartitioningForSampleQuery.
//use sampleSize to limit the size of returned data.
val connectionOptions = JsonOptions(Map(
    "url" -> url, 
    "dbtable" -> tableName, 
    "user" -> user, 
    "password" -> password, 
    "hashfield" -> primaryKey,
    "sampleQuery" -> query,
    "enablePartitioningForSampleQuery" -> true,
    "sampleSize" -> "1" ))
val dyf = glueContext.getSource("mysql", connectionOptions)
          .getDynamicFrame()
```

 **규칙 및 제한:** 

샘플 쿼리는 작업 북마크와 함께 사용할 수 없습니다. 두 가지 모두에 대한 구성이 제공되면 북마크 상태는 무시됩니다.

## 사용자 지정 JDBC 드라이버 사용
<a name="aws-glue-programming-etl-jdbc-custom-driver"></a>

다음 코드 예제에서는 사용자 지정 JDBC 드라이버로 JDBC 데이터베이스에서 읽고 쓰는 방법을 보여줍니다. 한 버전의 데이터베이스 제품에서 읽고 같은 제품의 나중 버전에 쓰는 작업을 볼 수 있습니다.

------
#### [ Python ]

```
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext, SparkConf
from awsglue.context import GlueContext
from awsglue.job import Job
import time
from pyspark.sql.types import StructType, StructField, IntegerType, StringType

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session

# Construct JDBC connection options
connection_mysql5_options = {
    "url": "jdbc:mysql://<jdbc-host-name>:3306/db",
    "dbtable": "test",
    "user": "admin",
    "password": "pwd"}

connection_mysql8_options = {
    "url": "jdbc:mysql://<jdbc-host-name>:3306/db",
    "dbtable": "test",
    "user": "admin",
    "password": "pwd",
    "customJdbcDriverS3Path": "s3://amzn-s3-demo-bucket/mysql-connector-java-8.0.17.jar",
    "customJdbcDriverClassName": "com.mysql.cj.jdbc.Driver"}

connection_oracle11_options = {
    "url": "jdbc:oracle:thin:@//<jdbc-host-name>:1521/ORCL",
    "dbtable": "test",
    "user": "admin",
    "password": "pwd"}

connection_oracle18_options = {
    "url": "jdbc:oracle:thin:@//<jdbc-host-name>:1521/ORCL",
    "dbtable": "test",
    "user": "admin",
    "password": "pwd",
    "customJdbcDriverS3Path": "s3://amzn-s3-demo-bucket/ojdbc10.jar",
    "customJdbcDriverClassName": "oracle.jdbc.OracleDriver"}

# Read from JDBC databases with custom driver
df_mysql8 = glueContext.create_dynamic_frame.from_options(connection_type="mysql",
                                                          connection_options=connection_mysql8_options)

# Read DynamicFrame from MySQL 5 and write to MySQL 8
df_mysql5 = glueContext.create_dynamic_frame.from_options(connection_type="mysql",
                                                          connection_options=connection_mysql5_options)
glueContext.write_from_options(frame_or_dfc=df_mysql5, connection_type="mysql",
                               connection_options=connection_mysql8_options)

# Read DynamicFrame from Oracle 11 and write to Oracle 18
df_oracle11 = glueContext.create_dynamic_frame.from_options(connection_type="oracle",
                                                            connection_options=connection_oracle11_options)
glueContext.write_from_options(frame_or_dfc=df_oracle11, connection_type="oracle",
                               connection_options=connection_oracle18_options)
```

------
#### [ Scala ]

```
import com.amazonaws.services.glue.GlueContext
import com.amazonaws.services.glue.MappingSpec
import com.amazonaws.services.glue.errors.CallSite
import com.amazonaws.services.glue.util.GlueArgParser
import com.amazonaws.services.glue.util.Job
import com.amazonaws.services.glue.util.JsonOptions
import com.amazonaws.services.glue.DynamicFrame
import org.apache.spark.SparkContext
import scala.collection.JavaConverters._


object GlueApp {
  val MYSQL_5_URI: String = "jdbc:mysql://<jdbc-host-name>:3306/db"
  val MYSQL_8_URI: String = "jdbc:mysql://<jdbc-host-name>:3306/db"
  val ORACLE_11_URI: String = "jdbc:oracle:thin:@//<jdbc-host-name>:1521/ORCL"
  val ORACLE_18_URI: String = "jdbc:oracle:thin:@//<jdbc-host-name>:1521/ORCL"

  // Construct JDBC connection options
  lazy val mysql5JsonOption = jsonOptions(MYSQL_5_URI)
  lazy val mysql8JsonOption = customJDBCDriverJsonOptions(MYSQL_8_URI, "s3://amzn-s3-demo-bucket/mysql-connector-java-8.0.17.jar", "com.mysql.cj.jdbc.Driver")
  lazy val oracle11JsonOption = jsonOptions(ORACLE_11_URI)
  lazy val oracle18JsonOption = customJDBCDriverJsonOptions(ORACLE_18_URI, "s3://amzn-s3-demo-bucket/ojdbc10.jar", "oracle.jdbc.OracleDriver")

  def main(sysArgs: Array[String]): Unit = {
    val spark: SparkContext = new SparkContext()
    val glueContext: GlueContext = new GlueContext(spark)
    val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray)
    Job.init(args("JOB_NAME"), glueContext, args.asJava)

    // Read from JDBC database with custom driver
    val df_mysql8: DynamicFrame = glueContext.getSource("mysql", mysql8JsonOption).getDynamicFrame()

    // Read DynamicFrame from MySQL 5 and write to MySQL 8
    val df_mysql5: DynamicFrame = glueContext.getSource("mysql", mysql5JsonOption).getDynamicFrame()
    glueContext.getSink("mysql", mysql8JsonOption).writeDynamicFrame(df_mysql5)

    // Read DynamicFrame from Oracle 11 and write to Oracle 18
    val df_oracle11: DynamicFrame = glueContext.getSource("oracle", oracle11JsonOption).getDynamicFrame()
    glueContext.getSink("oracle", oracle18JsonOption).writeDynamicFrame(df_oracle11)

    Job.commit()
  }

  private def jsonOptions(url: String): JsonOptions = {
    new JsonOptions(
      s"""{"url": "${url}",
         |"dbtable":"test",
         |"user": "admin",
         |"password": "pwd"}""".stripMargin)
  }

  private def customJDBCDriverJsonOptions(url: String, customJdbcDriverS3Path: String, customJdbcDriverClassName: String): JsonOptions = {
    new JsonOptions(
      s"""{"url": "${url}",
         |"dbtable":"test",
         |"user": "admin",
         |"password": "pwd",
         |"customJdbcDriverS3Path": "${customJdbcDriverS3Path}",
         |"customJdbcDriverClassName" : "${customJdbcDriverClassName}"}""".stripMargin)
  }
}
```

------

# JDBC 테이블을 병렬로 읽기
<a name="run-jdbc-parallel-read-job"></a>

JDBC 테이블의 속성을 AWS Glue에서 분할된 데이터를 병렬로 읽도록 설정할 수 있습니다. 특정 속성을 설정할 때 AWS Glue에게 데이터의 논리적 파티션에 대해 병렬 SQL 쿼리를 실행하도록 지시합니다. 해시 필드 또는 해시 표현식을 설정하여 파티셔닝을 제어할 수 있습니다. 데이터에 액세스할 때 사용되는 병렬 읽기의 수도 제어할 수 있습니다.

JDBC 테이블에서 병렬로 읽는 것은 성능을 향상시킬 수 있는 최적화 기법입니다. 이 기법이 적절한 시기를 식별하는 프로세스에 대한 자세한 내용은 AWS 권장 가이드의 *Apache Spark용 AWS Glue 작업 성능 조정 모범 사례* 가이드에 있는 [데이터 스캔량 감소](https://docs.aws.amazon.com/prescriptive-guidance/latest/tuning-aws-glue-for-apache-spark/parallelize-tasks.html)를 참조하세요.

병렬 읽기를 활성화하려면 테이블 구조의 파라미터 필드에서 키 값 페어를 설정합니다. JSON 표기법을 사용하여 테이블 파라미터 필드 값을 설정합니다. 테이블 속성을 편집하는 방법에 대한 더 자세한 정보는 [테이블 세부 정보 보기 및 편집](tables-described.md#console-tables-details)를 참조하십시오. ETL(추출, 변환 및 로드) 방법 `create_dynamic_frame_from_options` 및 `create_dynamic_frame_from_catalog`을 호출할 때도 병렬 읽기를 활성화할 수 있습니다 이러한 방법에서 옵션을 지정하는 방법은 [from\$1options](aws-glue-api-crawler-pyspark-extensions-dynamic-frame-reader.md#aws-glue-api-crawler-pyspark-extensions-dynamic-frame-reader-from_options) 및 [from\$1catalog](aws-glue-api-crawler-pyspark-extensions-dynamic-frame-reader.md#aws-glue-api-crawler-pyspark-extensions-dynamic-frame-reader-from_catalog) 단원을 참조하십시오.

이 방법을 JDBC 테이블, 즉 베이스 데이터가 JDBC 데이터 스토어인 대부분의 테이블에 사용할 수 있습니다. Amazon Redshift 및 Amazon S3 테이블을 읽을 때 이러한 속성은 무시됩니다.

**hashfield**  
`hashfield`을 사용할 JDBC 테이블의 열 이름으로 설정하여 데이터를 파티션으로 분할합니다. 파티션 사이로 데이터를 분배할 값이 이 열에 고르게 분포하는 것이 가장 좋습니다. 이 열은 데이터 형식이 될 수 있습니다. AWS Glue는 이 열로 분할된 데이터를 읽기 위해 병렬로 실행되는 비-중첩 쿼리를 생성합니다. 예를 들어, 데이터가 월별로 고르게 분포할 경우 `month` 열을 사용하여 각 월의 데이터를 병렬로 읽을 수 있습니다.  

```
  'hashfield': 'month'
```
AWS Glue은 쿼리를 생성하여 필드 값을 파티션 번호로 해싱하고 전체 파티션의 질의를 병렬로 실행합니다. 사용자의 쿼리를 사용하여 테이블 읽기를 분할하려면 `hashfield` 대신 `hashexpression`를 제공합니다.

**hashexpression**  
`hashexpression`을 자연수를 반환하는 SQL 표현식(JDBC 데이터베이스 엔진 문법 준수)으로 설정합니다. 간단한 표현식은 테이블의 숫자 열 이름입니다. AWS Glue는 `WHERE` 절의 `hashexpression`를 사용하여 JDBC 데이터를 병렬로 읽어 데이터를 분할할 SQL 쿼리를 생성합니다.  
예를 들어, 숫자 열 `customerID`를 사용하여 고객 번호로 분할된 데이터를 읽습니다.  

```
  'hashexpression': 'customerID'
```
AWS Glue이 파티셔닝을 제어하게 하려면 `hashexpression` 대신 `hashfield`를 제공합니다.

**hashpartitions**  
`hashpartitions`을 JDBC 테이블 병렬 읽기 번호로 설정합니다. 이 속성을 설정하지 않을 경우 기본값은 7입니다.  
예를 들어, 병렬 읽기 번호를 `5`로 설정하면 AWS Glue는 쿼리가 5개(또는 이하)인 데이터를 읽습니다.  

```
  'hashpartitions': '5'
```

# AWS Glue에서 Amazon RDS 데이터 스토어에 대해 JDBC를 연결하도록 Amazon VPC 설정
<a name="setup-vpc-for-glue-access"></a>

 JDBC를 사용하여 Amazon RDS의 데이터베이스에 연결하는 경우 추가 설정을 수행해야 합니다. AWS Glue 구성 요소가 Amazon RDS와 통신할 수 있도록 하려면 Amazon VPC에서 Amazon RDS 데이터 스토어에 대한 액세스를 설정해야 합니다. AWS Glue가 구성 요소 간에 통신하려면 보안 그룹이 모든 TCP 포트에 자기 참조 인바운드 규칙을 지정해야 합니다. 자체 참조 규칙을 생성하면 소스를 VPC의 동일한 보안 그룹으로 제한할 수 있습니다. 자체 참조 규칙을 사용한다고 해서 VPC가 모든 네트워크에 개방되는 것은 아닙니다. VPC의 기본 보안 그룹은 ALL Traffic의 자기 참조 인바운드 액세스 규칙이 있습니다.

**AWS Glue 및 Amazon RDS 데이터 스토어 간에 액세스를 설정하려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1. Amazon RDS 콘솔에서 Amazon RDS 데이터베이스에 대한 액세스를 제어하는 데 사용되는 보안 그룹을 식별합니다.

   왼쪽 탐색 창에서 **데이터베이스**를 선택한 다음 기본 창의 목록에서 연결하려는 인스턴스를 선택합니다.

   데이터베이스 세부 정보 페이지의 **연결 및 보안** 탭에서 **VPC 보안 그룹**을 찾습니다.

1. 네트워크 아키텍처를 기반으로 AWS Glue 서비스에 대한 액세스를 허용하도록 수정하는 것이 가장 적합한 관련 보안 그룹을 식별합니다. 나중에 참조할 수 있도록 *database-security-group*이라는 이름을 저장하세요. 적절한 보안 그룹이 없는 경우 Amazon RDS 설명서의 [보안 그룹을 생성하여 VPC에서 DB 인스턴스에 대한 액세스 권한 제공](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_SettingUp.html) 지침을 따르세요.

1. AWS Management Console에 로그인하고 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)에서 Amazon VPC 콘솔을 엽니다.

1. Amazon VPC 콘솔에서 *database-security-group*을 업데이트하는 방법을 확인합니다.

   왼쪽 탐색 창에서 **보안 그룹**을 선택한 다음 기본 창 목록에서 *database-security-group*을 선택합니다.

1. *database-security-group*, *database-sg-id*의 보안 그룹 ID를 식별합니다. 나중에 참조할 수 있도록 저장합니다.

   보안 그룹 세부 정보 페이지에서 **보안 그룹 ID**를 찾으세요.

1. *database-security-group*의 인바운드 규칙을 변경하고 AWS Glue 구성 요소가 통신할 수 있도록 자체 참조 규칙을 추가합니다. 구체적으로 **유형**이 `All TCP`, **프로토콜**이 `TCP`, **포트 범위**가 모든 포트를 포함하고 **소스**가 *database-sg-id*인 규칙을 추가하거나 있는지 확인합니다. **소스**에 입력한 보안 그룹이 편집 중인 보안 그룹과 동일한지 확인합니다.

   보안 그룹 세부 정보 페이지에서 **인바운드 규칙 편집**을 선택합니다.

   인바운드 규칙은 다음과 비슷하게 보입니다.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/setup-vpc-for-glue-access.html)

1. 아웃바운드 트래픽에 대한 규칙을 추가합니다.

   보안 그룹 세부 정보 페이지에서 **아웃바운드 규칙 편집**을 선택합니다.

   보안 그룹에서 모든 아웃바운드 트래픽을 허용하는 경우에는 별도의 규칙이 필요하지 않습니다. 예제:  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/setup-vpc-for-glue-access.html)

   네트워크 아키텍처가 아웃바운드 트래픽을 제한하도록 설계된 경우 다음과 같은 아웃바운드 규칙을 생성하세요.

   **유형**은 `All TCP`, **프로토콜**은 `TCP`, **포트 범위**는 모든 포트를 포함하고 **대상**은 *database-sg-id*인 자체 참조 규칙을 생성합니다. **대상**에 입력한 보안 그룹이 편집 중인 보안 그룹과 동일한지 확인합니다.

    Amazon S3 VPC 엔드포인트를 사용하는 경우에는 HTTPS 규칙을 추가하여 VPC에서 Amazon S3로의 트래픽을 허용하세요. **유형**은 `HTTPS`, **프로토콜**은 `TCP`, **포트 범위**는 `443`이고 **대상**이 Amazon S3 게이트웨이 엔드포인트인 *s3-prefix-list-id*에 대한 관리형 접두사 목록의 ID인 규칙을 생성합니다. 접두사 목록 및 Amazon S3 게이트웨이 엔드포인트에 대한 자세한 내용은 Amazon VPC 설명서에서 [Amazon S3에 대한 게이트웨이 엔드포인트](https://docs.aws.amazon.com//vpc/latest/privatelink/vpc-endpoints-s3.html)를 참조하세요.

   예제:  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/setup-vpc-for-glue-access.html)