将序列文件数据加载到使用存储为序列文件失败创建的配置单元表中

时间:2017-02-05 09:40:20

标签: hadoop hive sqoop

使用以下sqoop import命令将内容从MySQL导入HDFS作为序列文件

sqoop import --connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" 
    --username retail_dba --password cloudera 
    --table orders 
    --target-dir /user/cloudera/sqoop_import_seq/orders 
    --as-sequencefile 
    --lines-terminated-by '\n' --fields-terminated-by ','

然后我使用以下命令

创建配置单元表
create table orders_seq(order_id int,order_date string,order_customer_id int,order_status string) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '|' 
STORED AS SEQUENCEFILE

但是当我尝试使用以下命令

将从1st命令获得的序列数据加载到hive表中时
LOAD DATA INPATH '/user/cloudera/sqoop_import_seq/orders' INTO TABLE orders_seq;

它给出了以下错误。

Loading data to table practice.orders_seq
Failed with exception java.lang.RuntimeException: java.io.IOException: WritableName can't load class: orders
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask

我哪里错了?

1 个答案:

答案 0 :(得分:0)

首先,以这种格式提供数据是必要的吗?

假设您必须拥有该格式的数据。 加载数据命令不是必需的。一旦sqoop完成导入数据,您只需创建一个Hive表,指向您sqoop数据的同一目录。

脚本的一面注释:

create table orders_seq(order_id int,order_date string,order_customer_id int,order_status string)  
ROW FORMAT DELIMITED  
FIELDS TERMINATED BY '|'  
STORED AS SEQUENCEFILE

您的sqoop命令说明了这一点:--fields-terminated-by ','但是当您创建正在使用的表时:FIELDS TERMINATED BY '|'

根据我的经验,我最好的方法是sqoop the data as avro,这将自动创建一个avro架构。然后,您将只需使用先前创建的模式(AvroSerde)创建Hive表,并使用存储从sqooping进程获得的数据的位置。