2017-04-09 4 views
1

すべて -U-SQL Inner Joinは巨大な大きな書き込みファイルを作成します

ADLAを使用してテーブルを結合し、それらをAzure SQL DWにロードする際にいくつかの問題があります。

ロードプロセスの1つに固執しており、その問題をどのように修正できるか不明です。私はいくつかの購入情報を持っています。私はオン・プレ・システムからADLSにそれぞれ25 MB程度の出力ファイルを作成し、ADLAジョブで「INNER JOIN」を使うようにしようとすると、長い時間稼働しています。実行中は、出力ファイルが5GB以上になっています。私は、25 MBのファイルではあまりにも多く、何か間違っているかどうかわからないと感じています(VSから実行している間参照用にスクリーンキャプチャが添付されています)。

私が行うプロセスは、ADFを使用してオンデマンドDBからクラウドADLSストアへデータをロードします.2つのADLAジョブを実行してADLファイルをADLAテーブルにプルし、ROUND ROBINオプションを使用してデータスキューの問題を回避します。 ADLAジョブは集計ファイルをADLSストアに作成します4- ADFパイプラインを使用して#3ファイルをAzure SQLにロードDW

すべてのポインタまたはヘルプは非常に役に立ちます。

おかげで、Shabbir

はここに(私はすべてのフィールド名とクライアント情報を削除した)のコードです。お役に立てれば。

DECLARE @dir = "/{date:yyyy}/{date:MM}/{date:dd}/<FILE PATH>/"; 
DECLARE @in_1 string = <FILE #1>; 
DECLARE @in_2 string = <FILE #2>; 
DECLARE @out string = <OUTPUT FILE>; 

@file1 = 
    EXTRACT 
     <25 COL. WITH ALL NULLABLE> 
     date DateTime 
    FROM @in_1 
    USING Extractors.Text(delimiter : '|'); 

@file2 = 
    EXTRACT 
     <40 COL. WITH ALL NULLABLE> 
     date DateTime 
    FROM @in_2 
    USING Extractors.Text(delimiter : '|'); 

@output = 
    SELECT 
     <25 + 40 COL. FROM INPUT FILES> 
    FROM @file1 AS f1 
     INNER JOIN @file2 AS f2 
     ON f1.join1 == f2.join2; 

OUTPUT @purchase 
TO @out 
USING Outputters.Text(delimiter : '|'); 

これは、ADFパイプラインをスローし、日付とファイルのパスに外部パラメータを使用して実行されます。

enter image description here

+0

使用しているU-SQLコードを投稿してください。 – wBob

+0

Bob、私は自分の質問にコードスニペットを追加しました。前もって感謝します。 –

+0

結合でデータ量が増加している場合は、結合列に値が重複している可能性があります。値が左側の表に100回、右側の表に1000回あると、出力(デカルト積)に100,000行が表示されます。 Power BIでデータをロードするなどして確認できますか? –

答えて

0

あなたはADLAテーブルを使用して、ちょうどU-SQLで直接ファイルを扱うされていないように見えます。これは問題ありませんが、あなたがテーブルについて言及して以来、私はチェックしたかっただけです。また、コードはスクリプトに存在しない@purchaseを出力しています。実際のスクリプトで正しい行セットを実際に出力していると仮定します。

いくつかの質問:

  • あなたはADLSで入力ファイルの形式/内容を確認しましたか? @ file1と@ file2の出力を行って、期待どおりのものを作成していることを確認しましたか?
  • 出力ファイルが5 GBに増えていることをどのように知っていますか?ジョブグラフから?あなたはそれを添付できますか?
  • 「日付」列を使用していますか?
  • 結合列は単一の列ですか、どのような型ですか?
+0

はい。私は今のところADLAテーブルを使用していません。それもやってみましたが、同じ結果を得ました。 抽出ジョブを実行して出力を確認しましたが、すべての内容が表示されます。 はい、ジョブグラフに表示されます。 intデータ型の列と2つのテーブル間の1つの主な関係 質問にジョブグラフの画面キャプチャを添付しました。チェックしてください。 –

0

f1.join1 == f2.join2が(多かれ少なかれ)固有キーと他の(多かれ少なかれ)固有キーを実際に比較している場合は、適切な数の行を取得する必要があります。

しかし、多くの人がこの同じ構文を使用してCROSS JOINを実装しています。例えば、f1.join1は、表f1全体にわたって1であり、f2.join2は、表f2全体にわたって1であり得る。これらのデータ値により、出力は2つのテーブルのCROSS JOINになります。

関連する問題