RDBMS から月ごとに大量のデータをアンロードし、その月に基づいて Google Cloud Storage (GCS) にロードしました。次に、データセット全体を dataproc クラスタの pyspark データ フレームに読み込み、月ではなく日を基に GCS に再書き込みしたいと考えています。各ファイルに特定の日付のみが含まれるクラウド ストレージへの書き込みは成功しましたが、効率的に行うことができませんでした。その日付に基づいてファイルまたはディレクトリに名前を付けます。以下のコードは、私がやりたいことを実行しますが、非常に非効率的です。また、寄木細工のファイルを使用することで理論的にはこれを回避できることも知っていますが、私の要件は CSV として書き込むことです。最終的には、このデータを 1 日あたりのテーブルで bigquery にロードしたいと考えています。より簡単な解決策があれば (そして、1 日あたりの各テーブルをファイルにエクスポートするだけで済みます)。
# Find distinct dates, and then write based on that.
dates = sqlContext.sql("SELECT distinct THE_DATE FROM tbl")
x = dates.collect()
for d in x:
date = d.SLTRN_DT
single_wk = sqlContext.sql("SELECT * FROM tbl where THE_DATE = '{}'".format(date))
towrite = single_wk.map(to_csv)
towrite.coalesce(4).saveAsTextFile('gs://buck_1/AUDIT/{}'.format(date))
読み込んだデータの日付が ['2014-01-01', '2014-01-02', '2014-01-03'] だとすると、結果のファイル/ディレクトリは次のようになります。
gs://buck_1/AUDIT/2014-01-01/part-1
gs://buck_1/AUDIT/2014-01-01/part-2
gs://buck_1/AUDIT/2014-01-01/part- 3
gs://buck_1/AUDIT/2014-01-01/part-4
gs://buck_1/AUDIT/2014-01-02/part-1
gs://buck_1/AUDIT/2014-01-02/part-2
gs://buck_1/AUDIT/2014-01-02/part- 3
gs://buck_1/AUDIT/2014-01-02/part-4
gs://buck_1/AUDIT/2014-01-03/part-1
gs://buck_1/AUDIT/2014-01-03/part-2
gs://buck_1/AUDIT/2014-01-03/part- 3
gs://buck_1/AUDIT/2014-01-03/part-4