2016-05-19 17 views
13

Harici parke dosyalarının üzerine yerleştirilmiş bir kovan tablom var. Paruqet dosyaları kıvılcım işi tarafından oluşturulmalıdır, ancak meta veri bayrağını false değerine ayarlayarak bunlar oluşturulmamıştır. Bunu acısız bir şekilde geri yüklemek mümkün olup olmadığını merak ediyorum.Parke dosyaları için meta veriler oluşturma

/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 

dosya _metadata varolmayan veya eski olduğunu varsayalım: şu gibi dosyaların yapıdır. Bütün kıvılcım işine başlamak zorunda kalmadan kovan komutuyla yeniden yaratmanın/üretmenin bir yolu var mı?

+0

@Niemand Lütfen en son yorumunuzla birlikte soruğınızı düzeltin! –

+1

_metadata .parquet dosyasının yanında bölümlenmiş klasörlerinizin içinde yer almaz mı? Ayrıca, dosyaları kıvılcım kabuğundan okuyabiliyor musunuz? –

+0

Evet, bazı meta veriler dosyaların kendisinde bulunur ve evet, bunlar hem kıvılcım kabuğu hem de kovandan kesilebilirdir. Sadece bu özel _metadata dosyası olmadan kovan sorgulama çok daha yavaş olduğunu düşünüyorum. – Niemand

cevap

7

Tamam, işte buradaki matkap, meta verilere doğrudan Parke araçları kullanılarak erişilebilir. Öncelikle parke dosyası için alt bilgi almak gerekir:

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 
} 

Artık dosya meta alabilirsiniz takip gibidir:

Şimdi
def getFileMetadata(conf: Configuration, path: String) = { 
    getFooters(conf, path) 
    .asScala.map(_.getParquetMetadata.getFileMetaData.getKeyValueMetaData.asScala) 
} 

Eğer parke dosyasının meta alabilirsiniz :

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":{}}]})) 
gerektiğinde Ayrıca bağımsız meta veri dosyasını yazmak için çıkartılan altbilgiler kullanabilirsiniz

:

import org.apache.parquet.hadoop.ParquetFileWriter 

def createMetadata(conf: Configuration, path: String) = { 
    val footers = getFooters(conf, path) 
    ParquetFileWriter.writeMetadataFile(conf, new Path(path), footers) 
} 

Umarım bu soruya cevap verir. Spark DataFrames ve Metadata ile ilgili daha fazla bilgiyi awesome-spark'un spark-gotchas repo numaralı telefonundan okuyabilirsiniz.

İlgili konular