簡體   English   中英

使用 Scala 數據幀中的分區創建配置單元表

[英]Create hive table with partitions from a Scala dataframe

我需要一種從 Scala 數據幀創建配置單元表的方法。 hive 表應該在 S3 位置按日期分區具有 ORC 格式的基礎文件。

這是我到目前為止所得到的:

我以 ORC 格式將 Scala 數據幀寫入 S3

df.write.format("orc").partitionBy("date").save("S3Location)

我可以在 S3 位置看到 ORC 文件。 我現在在這些 ORC 文件的頂部創建一個 hive 表:

CREATE EXTERNAL TABLE "tableName"(columnName string)
PARTITIONED BY (date string)
STORED AS ORC
LOCATION "S3Location"
TBLPROPERTIES("orc.compress"="SNAPPY")

但是 hive 表是空的,即spark.sql("select * from db.tableName")沒有打印任何結果。

但是,當我刪除PARTITIONED BY行時:

CREATE EXTERNAL TABLE "tableName"(columnName string, date string)
STORED AS ORC
LOCATION "S3Location"
TBLPROPERTIES("orc.compress"="SNAPPY")

我看到了選擇查詢的結果。

似乎 hive 無法識別 spark 創建的分區。 我正在使用 Spark 2.2.0。

任何建議將不勝感激。

更新:

我從一個 spark 數據幀開始,我只需要一種方法來在它的頂部創建一個 hive 表(底層文件在 S3 位置采用 ORC 格式)。

我認為分區尚未添加到 hive Metastore,因此您只需要運行此 hive 命令:

MSCK REPAIR TABLE table_name

如果不起作用,您可能需要檢查以下幾點:

  • 將數據寫入 s3 后,文件夾應為: s3://anypathyouwant/mytablefolder/transaction_date=2020-10-30
  • 創建外部表時,位置應指向s3://anypathyouwant/mytablefolder

是的,Spark 將數據寫入 s3,但不會將分區定義添加到 hive Metastore 中! 並且 hive 不知道寫入的數據,除非它們位於可識別的分區下。 因此,要檢查 hive Metastore 中有哪些分區,您可以使用以下 hive 命令:

SHOW PARTITIONS tablename

在生產環境中,我不MSCK REPAIR TABLE為此目的使用MSCK REPAIR TABLE因為它會浪費太多時間。 最好的方法是讓您的代碼通過 rest api 僅將新創建的分區添加到您的 Metastore。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM