복붙노트

[HADOOP] 파케 파일에 대한 메타 데이터 생성

HADOOP

파케 파일에 대한 메타 데이터 생성

나는 외부 마루 파일의 하중의 위에 지어지는 하이브 테이블을 가지고있다. Paruqet 파일은 스파크 작업에 의해 생성되어야하지만 메타 데이터 플래그를 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 파일이 존재하지 않거나 오래되었다고 가정 해 봅시다. 하이브 명령을 통해 다시 만들거나 전체 스파크 작업을 시작하지 않고 생성 할 수있는 방법이 있습니까?

해결법

  1. ==============================

    1.여기서 드릴을 사용하면 파레트 도구를 사용하여 직접 메타 데이터에 액세스 할 수 있습니다. 먼저 파르 케 파일의 바닥 글을 가져와야합니다.

    여기서 드릴을 사용하면 파레트 도구를 사용하여 직접 메타 데이터에 액세스 할 수 있습니다. 먼저 파르 케 파일의 바닥 글을 가져와야합니다.

    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)
    }
    

    이 질문에 대한 답변이되기를 바랍니다. awesome-spark의 spark-gotchas repo에 대한 Spark DataFrames 및 Metadata에 대한 자세한 내용을 볼 수 있습니다.

  2. from https://stackoverflow.com/questions/37327626/generate-metadata-for-parquet-files by cc-by-sa and MIT license