2016-05-05 10 views
1

Spark SQLインテグレーションテスト用にHiveを設定する方法を探しています。これは、テーブルがテンポラリディレクトリまたはテストルートの下のどこかに書き込まれるようにします。私の調査では、HiveContextを作成する前に、fs.defaultFShive.metastore.warehouse.dirの両方を設定する必要があることが示唆されています。Sparkインテグレーションテストのハイブ設定

このanswerに記載されているとおり、後者を設定するだけで、Spark 1.6.1では機能しません。

val sqlc = new HiveContext(sparkContext) 
sqlc.setConf("hive.metastore.warehouse.dir", hiveWarehouseDir) 

表のメタデータは適切な場所に保存されますが、書かれたファイルは/ user/hive/warehouseに移動します。

データフレームは、例えば、

df.write.saveAsTable("tbl") 

ファイルを書き込む場所があると思われるデフォルトのデータベースのlocationを使用していますHiveMetastoreCatalog.hiveDefaultTableFilePathへの呼び出しを介して決定されるために、明示的なパスなしで保存されている場合HiveContextの構築時にキャッシュされるため、fs.defaultFSの設定後にHiveContextの構成は無効です。

これは、統合テストに非常に関連しています。これは、DROP TABLE tblがテーブルメタデータを削除するだけですが、テーブルファイルを残してしまうことを意味します。これは既知の問題です。herehereを参照してください。解決策は、hive.metastore.warehouse.dir == fs.defaultFS + user/hive/warehouseです。要するに

、このようfs.defaultFShive.metastore.warehouse.dirなどのプロパティをコンフィギュレーションすることができますどのようにプログラムでHiveContextコンストラクタの実行を設定しますか?

+0

2番目の段落では、Spark 1.6.1で動作していないことを述べていますが、これは他のバージョンでも動作することを意味していますか? – hbogert

+0

私はリンクしている@ steven-bakhtiariの答えのため、他のバージョンで作業していると思っていました。 – Sim

答えて

2

SparkSessionを作成する前に、SparkSessionのビルダーで「spark.sql.warehouse.dir」を設定することができます。正しく伝播するはずです。

Spark 1.6の場合は、プログラムでhite-site.xmlを作成することをお勧めします。

関連する問題