2016-07-29 15 views
4

Spark SQLを使用してHiveテーブルの静的パーティションにデータを挿入する方法を理解することができません。Spark SQLを使用して静的ハイブパーティションにデータを挿入

df.write.partitionBy("key").insertInto("my_table") 

しかし、私は静的パーティションにデータを挿入する方法を見つけることができません。つまり、DataFrameに列を追加することなく、DataFrame全体を書き込む必要があるパーティションを定義したいと考えています。

InsertIntoHiveTableクラスに記載されているスタティックパーティショニングを参照してください。サポートされていると思います。私がしたいことをするための公開APIはありますか?

+0

あなたがに似た任意のAPIを見つけることができましたダイナミックパーティションに書き込む? – Explorer

+1

いいえ、何も見つかりませんでした。一時テーブルとしてRRDを登録し、SQL INSERTを実行しました。しかし、Hiveコードの多くはSpark 2.0で書き直されているので、今では可能かもしれません。 –

答えて

1

あなたは

DataFrame tableMeta = sqlContext.sql(String.format("DESCRIBE FORMATTED %s", tableName)); 
String location = tableMeta.filter("result LIKE 'Location:%'").first().getString(0); 

を使用して、テーブルのパーティションを取得するために正規表現を使用することができます。あなたがテーブルの場所を取得したら、あなたは簡単のように、パーティションの場所を構築することができ

String partitionLocation = location + "/" + partitionKey 

(のPartitionKeyはdtのようなものです= 20160329 /時= 21)

その後、あなたはそのパスに書き込むことができ

df.write.parquet(partitionLocation) 

(私はデータフレームを構築する際に私の場合、私は、パーティション列が含まれていません。パーティション列が含まれているいずれかのエラーがあるかどうかわからない)

+1

私はDataFrameを一時テーブルとして登録し、そこから特定のパーティションにデータを挿入するHive SQLを実行するのがこれよりも優れている(それほど脆弱ではありません)が、Sparkでネイティブサポートについて具体的には不思議でした。 –

+0

HiveSQLを実行してデータを挿入することに同意します。私はこれもネイティブのサポートを探していますが、どこでもそれを見つけることができませんでした。 – tpham

関連する問題