2017-06-18 91 views
2

我有我的Spark任務,每30分鐘運行一次並將輸出寫入hdfs-(/tmp/data/1497567600000)。我有這個工作在集羣中連續運行。

如何在此數據之上創建Hive表?我在StackOverFlow中看到過一個解決方案,它在日期字段分區的數據之上創建配置單元表。這就好比,在HDFS的火花輸出上創建配置單元表

CREATE EXTERNAL TABLE `mydb.mytable` 
(`col1` string, 
    `col2` decimal(38,0), 
    `create_date` timestamp, 
    `update_date` timestamp) 
    PARTITIONED BY (`my_date` string) 
    STORED AS ORC 
    LOCATION '/tmp/out/' 

和解決方案建議修改表的,

ALTER TABLE mydb.mytable ADD PARTITION (my_date=20160101) LOCATION '/tmp/out/20160101' 

但是,在我的情況,我有多麼的輸出目錄正在寫不知道,等我顯然不能像上面建議的那樣創建分區。

如何處理這種情況,輸出目錄是以時間戳爲基礎隨機寫入的,而且格式不是(/tmp/data/timestamp= 1497567600000)?

如何讓Hive挑選目錄下的數據/tmp/data

回答

1

我可以建議兩種解決方案:

  • 如果你可以改變你的星火的工作,那麼你就可以分區按小時的數據(例如/tmp/data/1/tmp/data/2),加上蜂巢分區的每個小時,只寫有關分區
  • 你可以寫負責添加可以通過實現蜂巢分區bash腳本:
    • 使用清單HDFS子目錄的命令hadoop fs -ls /tmp/data
    • 使用命令表個
    • 上市蜂巢分區:hive -e 'show partitions table;'
    • 上述名單比較發現丟失的分區
    • 添加具有命令新蜂巢分區上面提供:ALTER TABLE mydb.mytable ADD PARTITION (my_date=20160101) LOCATION '/tmp/out/20160101'
+0

讓我考慮第二個解決方案。你能詳細說明答案嗎?我很困惑如何在這種情況下創建表來加載分區。 – Cheater

+0

你需要在你的問題中使用comman創建分區:'ALTER TABLE mydb.mytable ADD PARTITION(my_date = 20160101)LOCATION'/ tmp/out/20160101'' –