web-dev-qa-db-ja.com

AWS Glueを使用して多くのCSVファイルをParquetに変換する方法

次の設定でAWS S3、Glue、Athenaを使用しています。

S3->接着剤->アテナ

私の生データはS3にCSVファイルとして保存されます。 Glue for ETLを使用しており、Athenaを使用してデータを照会しています。

Athenaを使用しているため、CSVファイルをParquetに変換したいと思います。現在、これを行うためにAWS Glueを使用しています。これは私が使用している現在のプロセスです:

  1. クローラーを実行してCSVファイルを読み取り、データカタログを作成します。
  2. ETLジョブを実行して、データカタログからParquetファイルを作成します。
  3. クローラーを実行して、Parquetファイルを使用してデータカタログを作成します。

Glueジョブでは、一度に1つのテーブルのみを変換できます。 CSVファイルが多数ある場合、このプロセスはすぐに管理不能になります。 AWS Glueまたは他のAWSサービスを使用して多く CSVファイルをParquetに変換するより良い方法、おそらく「正しい」方法はありますか?

7
mark s.

Csvファイルを指しているクローラーによってカタログ化されたカタログテーブルを効率的にループし、それらを寄木細工に変換したいというまったく同じ状況がありました。残念ながら、ウェブにはまだ多くの情報がありません。そのため、 LinkedIn でブログを書いて、それをどのように行ったかを説明しています。読んでください。特別なポイント#5。お役に立てば幸いです。ご意見をお聞かせください。

注:Anttiのフィードバックに従って、以下のブログから抜粋したソリューションを貼り付けています。

  1. カタログ/データベース/テーブルを反復処理する

Job Wizardには、データソースで事前定義されたスクリプトを実行するオプションが付属しています。問題は、選択できるデータソースがカタログから単一のテーブルであるということです。データベース全体またはテーブルのセットでジョブを実行します。スクリプトは後で変更できますが、グルーカタログ内のデータベーステーブルを反復処理する方法も見つけるのが非常に困難です。開発者を支援するためのより多くのシナリオで強化することができます。

いじくり回した後、仕事をする以下のスクリプトを思いつきました。 boto3クライアントを使用して、テーブルをループしました。誰かの助けになるならここに貼り付けます。あなたがより良い提案を持っている場合、私はまたあなたから聞きたいです

import sys
import boto3
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
job = Job(glueContext)
job.init(args['JOB_NAME'], args)


client = boto3.client('glue', region_name='ap-southeast-2')

databaseName = 'tpc-ds-csv'
print '\ndatabaseName: ' + databaseName

Tables = client.get_tables(DatabaseName=databaseName)

tableList = Tables['TableList']

for table in tableList:
    tableName = table['Name']
    print '\n-- tableName: ' + tableName

    datasource0 = glueContext.create_dynamic_frame.from_catalog(
        database="tpc-ds-csv", 
        table_name=tableName, 
        transformation_ctx="datasource0"
    )

    datasink4 = glueContext.write_dynamic_frame.from_options(
        frame=datasource0,
        connection_type="s3", 
        connection_options={
            "path": "s3://aws-glue-tpcds-parquet/"+ tableName + "/"
            },
        format="parquet",
        transformation_ctx="datasink4"
    )
job.commit()
7
Tanveer Uddin

更新された情報については、編集を参照してください。

S3->アテナ

AthenaでCSV形式を直接使用してみませんか?

https://docs.aws.Amazon.com/athena/latest/ug/supported-format.html

CSVはサポートされている形式の1つです。また、効率を上げるために、複数のCSVファイルを圧縮してロードを高速化できます。

サポートされている圧縮、

https://docs.aws.Amazon.com/athena/latest/ug/compression-formats.html

それが役に立てば幸い。

編集:

なぜ寄木張りの形式がCSVよりも役立つのですか?

https://dzone.com/articles/how-to-be-a-hero-with-powerful-parquet-google-and

S3->接着剤->アテナ

CSVから寄木細工への変換の詳細、

https://aws.Amazon.com/blogs/big-data/build-a-data-lake-foundation-with-aws-glue-and-Amazon-s3/

2
Kannaiyan

手順1のように聞こえますが、個々のcsvファイル(たとえばsome-bucket/container-path/file.csv)をクロールしていますが、代わりにファイルレベルではなくパスレベル(たとえばsome- bucket/container-path /)とすべてのcsvファイルが均一である場合、クローラーはファイルごとに外部テーブルではなく単一の外部テーブルのみを作成する必要があり、すべてのファイルからデータを一度に抽出できます。

0
kinzleb