【AWS】Glue から DataCatalogテーブル に対して Spark SQLを実行する

■ はじめに

Glue から DataCatalogテーブル に対して
Spark SQLを実行した際に、いくつか注意点があるので
メモしておく

目次

【1】使用上の注意
 1)Glue Job で Glue DataCatalog を有効にする
 2)「select * from [DB].[Table] ...」ではなく「use [DB]」で指定する
【2】サンプル

【1】使用上の注意

1)Glue Job で Glue DataCatalog を有効にする
2)「select * from [DB].[Table] ...」ではなく「use [DB]」で指定する

1)Glue Job で Glue DataCatalog を有効にする

* これを設定しないと Glue Job から DataCatalog にアクセスできない
* Job の ジョブパラメータに以下を入力する
 キー :--enable-glue-datacatalog
 値:何も入れない

補足1:--enable-glue-datacatalog
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html

より抜粋
~~~~~~~~~
--enable-glue-datacatalog
— AWS Glue データカタログを 
 Apache Spark Hive メタストアとして使用できます。
~~~~~~~~~

補足2

* 2021/05/11現時点で、既存Jobに対して有効にしようと思ったら
 更新できなかった(AWS Management Consoleのバグ?)
 => 仕方がないので、新規にJobを作り直した

2)「select * from [DB].[Table] ...」ではなく「use [DB]」で指定する

例えば、以下「sample_db.sample_table」のように
「select * from [DB].[Table] ...」で指定した場合、例外が発生する
 => 一旦、spark.sql("USE [DB]") をかませる

ダメな例

# これだと例外が発生した
data_frame = spark.sql("SELECT * FROM sample_db.sample_table")

OKな例

spark.sql("USE sample_db")
data_frame = spark.sql("SELECT * FROM sample_table")

【2】サンプル

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

## Step1:初期化
args = getResolvedOptions(sys.argv, ['JOB_NAME'])
job_name = args['JOB_NAME']

print(f"Start {job_name}!!")

spark_context = SparkContext()
glue_context = GlueContext(spark_context)
spark = glue_context.spark_session

job = Job(glue_context)
job.init(job_name, args)

## Step2:対象DBを指定する
spark.sql("use sample_db")

# Step3:SQLクエリを実行する
data_frame = spark.sql("SELECT * FROM sample_table")

# Debug出力用
data_frame.show(n=5, truncate=False, vertical=True)

data_count = data_frame.count()
print(f"data_count  is {data_count}")

## Step4:後処理(コミット)
job.commit()

参考文献

https://qiita.com/pioho07/items/34716b2b63761100096a
公式サイト
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-programming-etl-glue-data-catalog-hive.html
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-programming-etl-glue-arguments.html

関連記事

AWS Glue ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/10/01/221926
AWS Glue ~ 基本編 / ジョブ ~
https://dk521123.hatenablog.com/entry/2019/11/17/231505
Glue から Redshift/PostgreSQL に接続する ~ Python shell編 ~
https://dk521123.hatenablog.com/entry/2020/08/26/193237
Glue から Redshift/PostgreSQL に接続する ~ PySpark編 ~
https://dk521123.hatenablog.com/entry/2020/09/23/111741
PySpark ~ DataFrame / テーブル・項目操作編 ~
https://dk521123.hatenablog.com/entry/2020/05/18/154829