大量の外部寄木細工のファイルの上に構築されたHiveテーブルがあります。寄木細工のファイルはsparkジョブで生成する必要がありますが、メタデータフラグをfalseに設定しているため、生成されませんでした。簡単な方法で復元できるかどうか疑問に思います。構造ファイルの数は次のようになります。
/apps/Hive/warehouse/test_db.db/test_table/_SUCCESS
/apps/Hive/warehouse/test_db.db/test_table/_common_metadata
/apps/Hive/warehouse/test_db.db/test_table/_metadata
/apps/Hive/warehouse/test_db.db/test_table/end_date=2016-04-20
/apps/Hive/warehouse/test_db.db/test_table/end_date=2016-04-21
/apps/Hive/warehouse/test_db.db/test_table/end_date=2016-04-22
/apps/Hive/warehouse/test_db.db/test_table/end_date=2016-04-23
/apps/Hive/warehouse/test_db.db/test_table/end_date=2016-04-24
/apps/Hive/warehouse/test_db.db/test_table/end_date=2016-04-25
/apps/Hive/warehouse/test_db.db/test_table/end_date=2016-04-26
/apps/Hive/warehouse/test_db.db/test_table/end_date=2016-04-27
/apps/Hive/warehouse/test_db.db/test_table/end_date=2016-04-28
/apps/Hive/warehouse/test_db.db/test_table/end_date=2016-04-29
/apps/Hive/warehouse/test_db.db/test_table/end_date=2016-04-30
ファイル_metadata
が存在しないか古くなっていると仮定しましょう。 sparkジョブ全体を開始せずに、Hiveコマンドを使用して再作成/生成する方法はありますか?
これがドリルです。Parquetツールを使用してメタデータに直接アクセスできます。最初に寄木細工のファイルのフッターを取得する必要があります:
import scala.collection.JavaConverters.{collectionAsScalaIterableConverter, mapAsScalaMapConverter}
import org.Apache.parquet.hadoop.ParquetFileReader
import org.Apache.hadoop.fs.{FileSystem, Path}
import org.Apache.hadoop.conf.Configuration
val conf = spark.sparkContext.hadoopConfiguration
def getFooters(conf: Configuration, path: String) = {
val fs = FileSystem.get(conf)
val footers = ParquetFileReader.readAllFootersInParallel(conf, fs.getFileStatus(new Path(path)))
footers
}
これで、次のようにファイルメタデータを取得できます。
def getFileMetadata(conf: Configuration, path: String) = {
getFooters(conf, path)
.asScala.map(_.getParquetMetadata.getFileMetaData.getKeyValueMetaData.asScala)
}
これで、寄木細工のファイルのメタデータを取得できます。
getFileMetadata(conf, "/tmp/foo").headOption
// Option[scala.collection.mutable.Map[String,String]] =
// Some(Map(org.Apache.spark.sql.parquet.row.metadata ->
// {"type":"struct","fields":[{"name":"id","type":"long","nullable":false,"metadata":{"foo":"bar"}}
// {"name":"txt","type":"string","nullable":true,"metadata":{}}]}))
抽出されたフッターを使用して、必要に応じてスタンドアロンのメタデータファイルを書き込むこともできます。
import org.Apache.parquet.hadoop.ParquetFileWriter
def createMetadata(conf: Configuration, path: String) = {
val footers = getFooters(conf, path)
ParquetFileWriter.writeMetadataFile(conf, new Path(path), footers)
}
これがあなたの質問に答えることを願っています。 Spark DataFrames and Metadata on awesome-spark 's spark-gotchas repo について詳しく読むことができます。