Hive 資料庫的攝取非常慢。為了減少攝取時間,我將它攝取到一個臨時資料庫中,然后我做 hdfs dfs -rmdir /path/to/original_db了一個hdfs dfs -mv /path/of/temp_db /path/to/original_db. 現在我需要重新創建表。
我計劃做一個DROP DATABASE temp_db CASCADE并重新創建由 spark 創建的新表并更改由SHOW CREATE TABLE temp_db.one_table. 我需要對每個表執行此操作,并將 temp_db 位置替換為新的原始位置。
有更好的方法嗎?也許我可以重命名資料庫并為表設定一個新位置。
uj5u.com熱心網友回復:
這里沒有答案,所以這是我的解決方案。
我上面設計的解決方案效果很好。使用它,即使我在資料更新期間開始的查詢也可以正常作業。Yarn 可以解決任何問題。
這是我在匯入新版本時使用的命令/path/mydb。我正在使用外部 Hive 表
- 將新資料匯入到
mydb_landing. 這些表是使用這個 pyspark 命令創建的:df.write.option("path", table_data_path).format("orc").mode("overwrite").saveAsTable(".".join(['mydb_landing', table_name])) - 我已經有了所有的表名,所以我得到了所有的創建陳述句:
create_stmts = [
spark.sql(
'show create table {schema}.{table_name}'.format(schema=base_dest_landing, table_name=table_name)
).first().createtab_stmt
for table_name in tables
]
- 在 Hive 中洗掉目標資料庫:
spark.sql('DROP DATABASE IF EXISTS {} CASCADE'.format(base_dest)) - 由于它只有外部表,我現在從 hdfs 中洗掉資料:
hdfs dfs -rm -r -f -skipTrash "/path/mydb" - 從 移動
mydb_landing到mydb。這是一個非常快速的操作,基本上是重命名:`hdfs dfs -mv '/path/mydb_landing' '/path/mydb`` - 現在我必須重新創建指向“新”位置的資料庫和表:
CREATE DATABASE mydb LOCATION '/path/mydb' - 重新創建表。這保證我得到任何模式更新:
for stmt in create_stmts:
create_stmt = stmt.replace('_landing', '')
spark.sql(create_stmt)
- 從 Hive 中洗掉登陸資料庫:
spark.sql('DROP DATABASE IF EXISTS mydb_landing CASCADE)
這篇Impala 博客文章有一些使用 Hive 視圖的好主意。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/449259.html
