AWS

AWS Glue에서 Spark를 이용해 MSSQL 데이터를 S3에 파티션 구조로 저장하기

whistory 2023. 1. 2. 08:10
반응형

 

1억 건이 넘는 데이터를 한 파일로 S3에 저장했다.

parquet 파일로 저장을 했고, 파일이 2GB가 넘는다.

 

Athena에서 count 쿼리를 날려보니 1억 2천 건이다.

 

Select * FROM table

명령어를 날려본다.

조회하는데 12분이 걸린다.

 

 

 

해당 데이터는 날짜기준 컬럼이 있다.

이 컬름을 기준으로 파티셔닝을 진행해본다.

 

 

spark 의 partitionBy() 를 사용한다.

partitionBy 에서 파티셔닝 할 컬럼명을 입력해준다.

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

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

## database information
server_name = "jdbc:sqlserver://serverip:port"
database_name = "database"
table_name = "table"
username = "user"
password = "password"

## s3 bucket information
bucket_name = "bucket_name"
target1_name = "prefix1"

url = server_name + ";" + "databaseName=" + database_name + ";"

jdbcDF = spark.read \\
        .format("com.microsoft.sqlserver.jdbc.spark") \\
        .option("url", url) \\
        .option("dbtable", f"dbo.{table_name}") \\
        .option("user", username) \\
        .option("password", password).load()
        
jdbcDF.write.format('parquet') \\
			.partitionBy("ymd_id") \\
			.mode("overwrite") \\
			.save(f"s3://{bucket_name}/{target1_name}/{database_name }/{table_name}/")
  
print(f"upload path = s3://{bucket_name}/{target1_name}/{database_name}/{table_name}/")

job = Job(glueContext)
job.init(args['JOB_NAME'], args)
job.commit()

 

 

반응형