2017-07-17 16 views
1

私はスパークするのが初めてです。私はとして来るjsonデータを持っています。このデータをハイブテーブルに格納する必要があります。 HttpGet要求ごとに、テーブル内の単一の行になるjsonが返されます。このため、ハイブテーブルのディレクトリにファイルとして単一の行を書き込む必要があります。データフレームに行を再帰的に追加する

しかし、私は小さすぎるファイルを持っていると感じるので、速度と効率が低下します。だから私は再帰的にDataframeに新しい行を追加し、ハイブテーブルのディレクトリに一度に書き込む方法があります。私はこれも私のスパークコードの実行時間を減らすと思う。

例:私は、データフレームは不変であることを理解

for(i <- 1 to 10){ 
newDF = hiveContext.read.json("path") 
df = df.union(newDF) 
} 
df.write() 

。これを達成する方法はありますか?

ご協力いただければ幸いです。ありがとうございました。

答えて

1

あなたは正しい軌道に乗って大部分があり、何がやりたいことはSeq[DataFrame]として、複数の単一レコードを取得し、それらを合併することにより、単一のDataFrameSeq[DataFrame]を減らすことです。あなたが提供されているコードから行く

:あなたが行くようにHTTPリクエストを実行する場合

val BatchSize = 100 
val HiveTableName = "table" 

(0 until BatchSize). 
map(_ => hiveContext.read.json("path")). 
reduce(_ union _). 
write.insertInto(HiveTableName) 

を別の方法としては、私たちもそれを行うことができます。あなたがHTTPリクエストを行い、データフレームに変換する機能を持っていると仮定しましょう:

def obtainRecord(...): DataFrame = ??? 

あなたはの線に沿って何かを行うことができます。

val HiveTableName = "table" 
val OtherHiveTableName = "other_table" 
val jsonArray = ??? 

val batched: DataFrame = 
    jsonArray. 
    map { parameter => 
     obtainRecord(parameter) 
    }. 
    reduce(_ union _) 
batched.write.insertInto(HiveTableName) 
batched.select($"...").write.insertInto(OtherHiveTableName) 
+0

この回答に感謝します。私はこれを実装しようとしています。get要求を投稿するには、json配列の各要素からパラメータを取得する必要があります(以前に取得されています)。ですから、forループを実装するより良い方法があるので、各繰り返しで増加する変数を持つことができます(この変数は配列の各要素のパラメータにアクセスするために使用されます)。 –

+0

0から何かに増分するインデックスが必要ですか? –

+0

私はちょうどあなたがしようとしていることを反映すると思う答えを更新しました。これは、取得したJSON配列を一度に処理したい(そして1つのファイルに書き込む)ことを前提としています。また、何をしたいかに応じて、JSON配列を分割するか、複数のJSON配列を連結することもできます。 –

0

あなたは明らかにスパークを悪用しています。 Apache Sparkは分析システムであり、データベースAPIではありません。このようにHiveデータベースを修正するためにSparkを使用する利点はありません。分散処理を含むスパーク機能の恩恵を受けることなく、重大なパフォーマンス上の不利益を被るだけです。

代わりに、Hiveクライアントを直接使用してトランザクション操作を実行する必要があります。

+0

私は申し訳ありませんが、あなたは私の質問を理解していませんでした?私はJsonから得たデータフレームをハイブテーブルのディレクトリに保存しようとしています。私はスパークを使ってHiveテーブル/データベースを変更しようとしていません。 –

+0

これは質問に対する答えではありません。代わりに質問のコメントにする必要があります。 – TriskalJM

0

データをすべて(たとえばcurlやその他のプログラムを使用してスクリプトを使用して)一括ダウンロードし、最初にファイルに保存することができれば(多くのファイルでは、ディレクトリ全体を一度に読み込むことができます)そのファイル(または複数のファイル)をまとめてロードして処理します。また、一度に1つのレコードではなく、必要なすべてのデータをフェッチするエンドポイントとしてwebapiを確認します。

+0

答えをありがとう。あなたが与えたことは良いアプローチです。しかし、APIから一度にすべてのデータを取得する方法はありません。そして、データフレームをjsonファイルとして保存する必要があります。すべてのレコード(javaを使用)でjsonファイルを作成することは可能ですか?はいの場合、そのファイルを自分のデータフレームに読み込むことができます。 –

+0

@HemanthAnnavarapuはい、私が示唆していたことですが、すべてのデータをファイルまたは複数のファイルに事前にダウンロードしてください。 'curl -w" \ n "[url] >> [jsonfile]'のようなものがすべてのURLをループして動作するはずです。また、javaやscalaなどの言語を使ってダウンロードすることもできます。 – puhlen

関連する問題