使用以下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
我哪里错了?
答案 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进程获得的数据的位置。