hadoop - 将 TDCH 用于 hcat 作业类型的异常。不支持 DATE 列

标签 hadoop hive teradata hcatalog

我正在运行的查询是:

 hadoop com.teradata.hadoop.tool.TeradataExportTool  -url     
 jdbc:teradata://tdx/TMODE=ANSI,CHARSET=UTF8,database=db  -username  
 xxx -password xxx -jobtype hcat -sourcetable customers -
 sourcedatabase xxx -nummappers 1 -targettable customers

在运行作业时,我得到这个异常:

com.teradata.connector.common.exception.ConnectorException:不支持 DATE 字段数据类型 在 com.teradata.connector.hive.utils.HiveSchemaUtils.lookupHiveDataTypeByName(HiveSchemaUtils.java:475) 在 com.teradata.connector.hcat.utils.HCatSchemaUtils.getRecordSchema(HCatSchemaUtils.java:396) 在 com.teradata.connector.hcat.processor.HCatInputProcessor.inputPreProcessor(HCatInputProcessor.java:89) 在 com.teradata.connector.common.tool.ConnectorJobRunner.runJob(ConnectorJobRunner.java:116) 在 com.teradata.connector.common.tool.ConnectorExportTool.run(ConnectorExportTool.java:62) 在 org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) 在 org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84) 在 com.teradata.hadoop.tool.TeradataExportTool.main(TeradataExportTool.java:29) 有什么办法可以解决这个问题吗? hive表的crate表语句为:

CREATE EXTERNAL TABLE `customers`(                                                  
`row_id` string,                                                                         
`source_start_date` date,                                                                
`source_start_timestamp` timestamp,                                                      
`target_start_timestamp` timestamp,                                                      
`target_start_date` date,                                                                
`source_end_date` date,                                                                  
`source_end_timestamp` timestamp,                                                        
`target_end_date` date,                                                                  
`target_end_timestamp` timestamp,                                                        
`active` string,                                                                         
`is_deleted` string,                                                                     
`status_flag` string,                                                                    
`first_name` string,                                                                         
`last_name` string,                                                                          
`city` string,                                                                                  
)                                                                         
PARTITIONED BY (                                                                               
   `join_dt` date)                                                                           
ROW FORMAT SERDE                                                                               
   'org.apache.hadoop.hive.ql.io.orc.OrcSerde'                                                  
STORED AS INPUTFORMAT                                                                          
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'                                            
OUTPUTFORMAT                                                                                   
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'                                           
LOCATION                                                                                       
   'xxx'   
TBLPROPERTIES (                                                                                
 'transient_lastDdlTime'='1461674429')  

感谢任何指点。

最佳答案

我找不到让日期有效的方法,但我找到了解决方法。我创建了一个临时表,其中的日期列强制转换为字符串。 例如,您创建了一个表:

Create table person ( person_id int, joining_date date);

从这个表中,您可以创建临时配置单元表,如:

Create table temp_person as select person_id, cast(joining_date as string) from person;

在目标 teradata 端,您可以将数据类型指定为日期:

Create multiset table person ( person_id int, joining_date date);

现在您可以像这样运行作业:

hadoop com.teradata.hadoop.tool.TeradataExportTool  -url     
jdbc:teradata://tdx/TMODE=ANSI,CHARSET=UTF8,database=db  -username  
xxx -password xxx -jobtype hcat -sourcetable temp_person -
sourcedatabase xxx -nummappers 1 -targettable person

这很好用。但由于复制表的开销,性能略有下降。

关于hadoop - 将 TDCH 用于 hcat 作业类型的异常。不支持 DATE 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37026082/

相关文章:

hadoop - 为初始化指定的未知版本 : 3. 1.0 schemaTool 失败

java - HBase内部是如何解析 "hbase shell command"的?

sql - Impala或Hive在其他SQL语法中是否具有类似于IN子句的内容?

sql - 如果组合键为 null,则填充先前的值 如果没有值则填充 null

mysql - 使用 REGEX 重新格式化字符串

hadoop - Hadoop中Map Tasks的核心亲和性

使用 Kerberos 的 Hadoop Web 身份验证

scala - 如何从年月日分区列的列表中提取最新/最近的分区

xml - 在Hive XML SerDe中使用 “Attribute to Attribute”映射

sql - 选定的非聚合值必须是关联组的一部分