2014-10-02 84 views
2

我一直在使用sqoop create-hive-table命令和適當的參數,這些參數會將表格模式從mysql或任何RDBMS複製到配置單元中。今天我碰到一個要求,我必須使用Sqoop使用「sqoop create-hive-table」創建表模式

「sqoop create-hive-table」和--hive-partition-key來創建指定了分區列的表模式。所述sqoop命令我使用:

sqoop創建-蜂房表--connect JDBC:MySQL的://本地主機/ XYZ \ --username XYZ --password密碼\ --table POC_XYZ_Partition \ --hive-表POC_XYZ.POC_Datatype_Mapping_Sodhi \ --hive分區密鑰join_date \ --fields封端-由 '' --lines封端-用 '\ n'

與所述錯誤消息差錯出:

ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.IllegalArgumentException: Partition key join_date cannot be a column to import.

我知道分區鍵不應該是create table命令的一部分,但我完全忘了這一點。

然後我發現了一個變通辦法,做:

sqoop create-hive-table --connect jdbc:mysql://localhost/XYZ \ --username XYZ --password password \ --table POC_XYZ_Partition \ --hive-table POC_XYZ.POC_Datatype_Mapping_Sodhi \ --hive-partition-key join_date_partition \ --fields-terminated-by ',' --lines-terminated-by '\n'

上面創建的模式,但後來當我試圖從MySQL數據加載到HDFS它正在考慮join_date_partition是一部分MySQL表,並沒有從MySQL獲取數據。

我嘗試了許多解決方案,如:

sqoop import --connect jdbc:mysql://localhost/XYZ \ --username XYZ --password password \ --query 'select a.*, a.join_date as join_date_partition from POC_XYZ_Partition a WHERE $CONDITIONS' \ --split-by id \ --hcatalog-database POC_XYZ \ --hcatalog-table POC_XYZ_Partition;

但無法導入,因爲sqoop一個錯誤,這會不會讓我在sqoop重複列名的數據。

有沒有人遇到過這個問題並解決了它?如果是這樣,請建議

回答

1

看起來-hive-partition-key(和值)只對將數據上傳到表中有關係,但對於創建表而言並不重要。這也迫使一個人只能加載到一個單一的分區。

但是你可以嘗試做你的任務在幾個步驟:

  1. 創建partitioned_table
  2. 通過sqoop將-create-hive-table加載到純樸配置單元中plain_table
  3. 將數據裝載到分區表,通過使用這樣的:

INSERT OVERWRITE TABLE partitioned_table PARTITION(partitionColumn) SELECT col1, ... colN, partitionColumn FROM plain_table;

+0

蜂房表示分配塔物理作爲文件夾,並把數據存儲在各自的文件夾。問題不在於將數據加載到表中。實際的問題是將分區鍵也作爲數據的值以及正在創建的文件夾。 此外,我認爲-create-hive-table不會加載數據,但只是創建配置單元表架構。 因爲我們發現這是一個錯誤,我們使用了一個解決方案,使分區鍵具有不同的名稱,使其成爲數據的一部分,並且還作爲分區鍵。 – Maverick4U 2014-11-10 20:59:29

+0

分區確實包含值:文件夾被稱爲'month = SEP',其中'month'是分區列名,'SEP'是它的值(至少對於hive 0.13是這樣的)。 – arghtype 2014-11-11 06:26:04