2014-10-02 85 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