2017-03-10 10 views
1

明示的なパスを使わないでテーブルを保存しようとすると、ハイブストアは "/ hive/warehouse"の代わりに "/ user/hive/warehouse"を指す偽の "path"プロパティを持ちます。私がを明示的ににしたい場合、.option( "path"、 "/ hive/warehouse")を使用してパスを設定すると、すべて動作しますが、Hiveは外部テーブルを作成します。管理対象テーブルをハイブメタストアに保存し、ハイブ内のファイルの場所と一致しないその偽のパスプロパティを持たない方法はありますか?HiveにsaveAsTableを設定する方法(HiveテーブルがMANAGED_TABLEになるように)

from pyspark.sql import SparkSession 

spark = SparkSession.builder.master(master_url).enableHiveSupport().getOrCreate() 

df = spark.range(100) 

df.write.saveAsTable("test1") 
df.write.option("path", "/hive/warehouse").saveAsTable("test2") 

hive> describe formatted test1; 
OK 
# col_name    data_type    comment    

id      bigint          

# Detailed Table Information   
Database:    default     
Owner:     root      
CreateTime:    Fri Mar 10 18:53:07 UTC 2017  
LastAccessTime:   UNKNOWN     
Protect Mode:   None      
Retention:    0       
Location:    file:/hive/warehouse/test1 
Table Type:    MANAGED_TABLE    
Table Parameters:   
    spark.sql.sources.provider parquet    
    spark.sql.sources.schema.numParts 1     
    spark.sql.sources.schema.part.0 {\"type\":\"struct\",\"fields\":[{\"name\":\"id\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}}]} 
    transient_lastDdlTime 1489171987   

# Storage Information   
SerDe Library:   org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe 
InputFormat:   org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat  
OutputFormat:   org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat 
Compressed:    No      
Num Buckets:   -1      
Bucket Columns:   []      
Sort Columns:   []      
Storage Desc Params:   
    path     file:/user/hive/warehouse/test1 
    serialization.format 1     
Time taken: 0.423 seconds, Fetched: 30 row(s) 


hive> describe formatted test2; 
OK 
# col_name    data_type    comment    

id      bigint          

# Detailed Table Information   
Database:    default     
Owner:     root      
CreateTime:    Fri Mar 10 16:02:07 UTC 2017  
LastAccessTime:   UNKNOWN     
Protect Mode:   None      
Retention:    0       
Location:    file:/hive/warehouse/test2 
Table Type:    EXTERNAL_TABLE   
Table Parameters:   
    COLUMN_STATS_ACCURATE false    
    EXTERNAL    TRUE     
    numFiles    2     
    numRows     -1     
    rawDataSize    -1     
    spark.sql.sources.provider parquet    
    spark.sql.sources.schema.numParts 1     
    spark.sql.sources.schema.part.0 {\"type\":\"struct\",\"fields\":[{\"name\":\"id\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}}]} 
    totalSize    4755     
    transient_lastDdlTime 1489161727   

# Storage Information   
SerDe Library:   org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe 
InputFormat:   org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat  
OutputFormat:   org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat 
Compressed:    No      
Num Buckets:   -1      
Bucket Columns:   []      
Sort Columns:   []      
Storage Desc Params:   
    path     file:/hive/warehouse/test2 
    serialization.format 1     
Time taken: 0.402 seconds, Fetched: 36 row(s) 

答えて

1

問題を修正しました。同様の問題を抱えている人々のために、私は修正を掲載します。

"path"パラメータが誤っているこの問題は、以下のようにデフォルトのハイブデータベースにテーブルを保存するときにのみ発生します。これにより、新しいデータベースが新しい値を使用している間に、古いデータベースが古い構成値(hive.metastore.warehouse.dir)を使用していた可能性があると私は考えました。

このように、デフォルトデータベースを削除してデータベースを再作成すると、ハイブメタストアで作成されたすべてのデータベースが正しい値のhive.metastore.warehouse.dirを使用するようになりました。

spark.sql("create database testdb") 
spark.sql("use testdb") 
df.write.saveAsTable("test3") 

hive> describe formatted test.test3; 
OK 
# col_name    data_type    comment    

id      bigint          

# Detailed Table Information   
Database:    testdb     
Owner:     root      
CreateTime:    Fri Mar 10 22:10:10 UTC 2017  
LastAccessTime:   UNKNOWN     
Protect Mode:   None      
Retention:    0       
Location:    file:/hive/warehouse/test.db/test3 
Table Type:    MANAGED_TABLE    
Table Parameters:   
    COLUMN_STATS_ACCURATE false    
    numFiles    1     
    numRows     -1     
    rawDataSize    -1     
    spark.sql.sources.provider parquet    
    spark.sql.sources.schema.numParts 1     
    spark.sql.sources.schema.part.0 {\"type\":\"struct\",\"fields\":[{\"name\":\"id\",\"type\":\"long\",\"nullable\":true,\"metadata\":{}}]} 
    totalSize    409     
    transient_lastDdlTime 1489183810   

# Storage Information   
SerDe Library:   org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe 
InputFormat:   org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat  
OutputFormat:   org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat 
Compressed:    No      
Num Buckets:   -1      
Bucket Columns:   []      
Sort Columns:   []      
Storage Desc Params:   
    path     file:/hive/warehouse/test.db/test3 
    serialization.format 1     
Time taken: 0.243 seconds, Fetched: 35 row(s) 
0

hive.metastore.warehouse.dir

  • デフォルト値:/ユーザ/ハイブ/倉庫
  • 追加された場合:のハイブ0.2.0

    場所倉庫のデフォルトデータベース。

https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties

+0

(ハイブメタストアノードとすべてのスパークノードの両方で)hive-site.xmlでそのプロパティを設定し、そのプロパティを/ hive/warehouseに設定しました。上記のdescribeテーブルのコマンドを見ると、hiveは 'path'プロパティではなく 'location'プロパティでこのパスを尊重します。私は、場所とパスのプロパティの違いは何か分かりません。 – gnicholas

関連する問題