我一直在使用sqoop create-hive-table命令和适当的参数,这些参数会将表模式从mysql或任何RDBMS复制到hive中。今天我遇到了一个必须使用
的要求“sqoop create-hive-table”以及--hive-partition-key以创建指定了分区列的表模式。我使用的sqoop命令:
sqoop create-hive-table --connect jdbc:mysql:// localhost / XYZ \ --username XYZ - 密码密码 - 表POC_XYZ_Partition \ --hive-table POC_XYZ.POC_Datatype_Mapping_Sodhi \ --hive-partition-key join_date \ --fields-terminated-by',' - lines-terminated-by'\ 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中的列名。
有人遇到过这个问题并解决了吗?如果是这样,请建议
答案 0 :(得分:1)
似乎-hive-partition-key
(和值)仅对将数据上传到表而不是用于表创建很重要。这也迫使一个人只加载到一个分区。
但你可以尝试分几步完成任务:
-create-hive-table
的sqoop数据加载到普通配置单元 plain_table 。 INSERT OVERWRITE TABLE partitioned_table
PARTITION(partitionColumn)
SELECT col1, ... colN, partitionColumn
FROM plain_table;