0

次のように、Spark で ORC 形式のデータを作成しました。

var select: String = "SELECT ..."
sqlContext.sql(select).write.format("orc").save("/tmp/out/20160101")
select = "SELECT ..."
sqlContext.sql(select).write.format("orc").save("/tmp/out/20160102")
& so on...

今、次のようにHiveで外部テーブルを作成しようとしています:

CREATE EXTERNAL TABLE `mydb.mytable`
 (`col1` string, 
  `col2` decimal(38,0), 
  `create_date` timestamp, 
  `update_date` timestamp)
  PARTITIONED BY (`my_date` string)
  STORED AS ORC
  LOCATION '/tmp/out/';

私がする時:

"select count(*) from mydb.mytable"

カウント値を 0 として取得します。しかし、Spark-shell で実行すると、次のようになります。

val results = sqlContext.read.format("orc").load("/tmp/out/*/part*")
results.registerTempTable("results")
sqlContext.sql("select count(*) from results").show

期待どおりに500,000行を取得します。

「パーティション」が認識されていないようです。Spark で作成されたデータの上に「外部」Hive テーブルを作成するにはどうすればよいですか?

4

1 に答える 1

2

Hive は新しいパーティションを自動的に見つけません。新しいパーティションを作成した後、ハイブ テーブルを更新する必要があります。パーティションが作成されてハイブ テーブルに追加されると、そのパーティション内のファイルを好きなように追加および削除できます。これらの変更は、メタストアを更新する必要なくすぐに反映されます。

クエリを使用ALTER TABLEして、メタストアに新しいパーティションを作成できます。

ALTER TABLE mydb.mytable 
ADD PARTITION (my_date='20160101')
LOCATION '/tmp/out/20160101'

Hive がそれらを取得できるように、すべての出力ディレクトリに対してこのクエリを実行する必要があります。

ただし、Hive にはそのパーティションの標準命名規則があり<column_name>=<value>ます。この命名スキームを使用すると、いくつかの利点があります。LOCATIONまず、クエリから句を省略ALTER TABLEできますが、代わりに別のクエリを使用することもできます。MSCK REPAIR TABLE <table_name>これにより、すべてのディレクトリがパーティションとしてメタストアに追加されます。これは、一度に多くのパーティションを追加する場合に便利で、追加するすべてのパーティション列の値を知る必要がないことを意味します。

于 2016-12-08T21:44:22.837 に答える