2016-01-04 35 views
-1

假設在任何關係數據庫中都有一個名爲T1的表格,其中包含100列以上的表格。我將sqoop以CSV格式導入HDFS。Sqoop導入 - 源表格架構變更

現在再向表格T1添加10列。如果我將這些數據導入到HDFS中,新數據將會有比以前多10個列。

問題:

  1. 如何sqoop命令列正在導入,使舊的和新的數據(至少在T1改變之前的列)是在正確的位置?

  2. 有了新的列,這些列在最後總會被導入嗎?

  3. 如果某列被刪除,該怎麼辦?如何處理這種情況,即舊數據和新數據如何保留這些位置?

回答

1

如何sqoop命令導入的列,使舊的和新的數據(至少在T1改變之前的列)是在正確的位置?

所有基於Hadoop的工具都不會在將數據寫入HDFS時強制實施模式。默認情況下,它不會嘗試用新字段更新舊數據。 Sqoop不知道HDFS中的數據列。對於新數據,這一切都取決於您如何編寫sqoop導入命令。如果使用--table子句和--columns子句,則數據將按照源上的順序。如果您發出--query子句以提供自定義查詢來提取數據,那麼該順序將基於查詢中select子句的列順序。如果您不想明確提及列名作爲sqoop導入的一部分,則可以考慮在源數據庫上創建視圖。

有了新列,這些列總是在最後導入嗎?

不一定,因爲我以前

解釋的。如果什麼一列被刪除?如何處理這種情況,即舊數據和新數據如何保留這些位置?

如果刪除列,很可能必須重新加載數據或在處理時根據特定規則處理它。更好的方法是重新加載數據或在源數據庫上創建視圖。

這些不是sqoop它自身的限制,它們是標準問題,無論您使用的技術如何,都需要定製解決方案。問題太籠統了,因此爲其獲取API可能不太可行。

+0

據我所知,hadoop是讀取模式; Q1和Q2:我的問題更多地是關於列的順序和源列的數量。如果在查詢中指定的列過多,只是想知道是否有一些選項可以通過某種方式保留順序,而不必通過使用某些數據庫功能來明確指定列。而在Q3上,也許我們可以在select查詢中插入一個空字符串來刪除被刪除的列,以免重新加載? – learninghuman

+0

如果您正在從數據庫中查找,則實際上可以在源數據庫上創建視圖並使用--table傳遞視圖。鑑於您可以定義訂單。 –