我正在尝试通过mysql数据库中的sqoop将数据加载到hive中已存在的表中。我指的是以下指南供参考: - http://sqoop.apache.org/docs/1.4.5/SqoopUserGuide.html#_importing_data_into_hive
--hive-import
已成功通过测试。
我创建了一个hive表,如下所示: -
create table sqoophive (id int, name string, location string)
row format delimited
fields terminated by '\t'
lines terminated by '\n'
stored as textfile;
根据需要加载数据。
我想使用--hive-overwrite
选项覆盖上表中的内容。根据上面提到的指南 - “--hive-overwrite覆盖Hive表中的现有数据。”
“如果Hive表已经存在,您可以指定--hive-overwrite选项以指示必须替换配置单元中的现有表。”
所以我分别尝试了以下查询以获得结果: -
sqoop import --connect jdbc:mysql://localhost/test --username root --password 'hr' --table sample --hive-import --hive-overwrite --hive-table sqoophive -m 1 --fields-terminated-by '\t' --lines-terminated-by '\n'
sqoop import --connect jdbc:mysql://localhost/test --username root --password 'hr' --table sample --hive-overwrite --hive-table sqoophive -m 1 --fields-terminated-by '\t' --lines-terminated-by '\n'
但不是替换现有表格中的内容,而是在下面的路径中创建了一个文件/user/<username>/<mysqltablename>
有人可以解释一下我哪里出错了吗?
答案 0 :(得分:1)
第一个查询应该可以正常工作。由于架构已经存在,我没有终止字段并终止行。
关键字--hive-import
和--hive-overwrite
应该在那里。
如果只有--hive-overwrite
,则不会将数据加载到表中。只是复制到hdfs。
答案 1 :(得分:0)
将_SUCCESS文件放在
中/user/<username>/<mysqltablename>
你可以改变--warehouse-dir的位置 例如: - warehouse-dir / tmp
有人会认为hive-overwrite会处理这个问题,这意味着首先删除该目录。但有充分理由,Hive不想开始在HDFS中删除目录。如果有什么东西放在那里怎么办?
hive-overwrite说,“我要覆盖Hive中的行,而不仅仅是添加到表中。”因此,你不会有重复。
您必须先删除该目录和_SUCCESS文件;或者更好,在导入成功后。
hadoop fs -rm -R /user/<username>/<mysqltablename>
答案 2 :(得分:0)
sqoop import
没有--target-dir
或--warehouse-dir
(对于--hive-import
)将导入/user/<username>/<mysqltablename>
:
By default,Sqoop会将名为
foo
的表导入到名为的目录中 在HDFS中的主目录中foo
。例如,如果您的用户名 是someuser
,然后导入工具将写入/user/someuser/foo/(files)
。您可以调整的父目录 使用--warehouse-dir
参数导入。您还可以使用
显式选择目标目录--target-dir
param
但是@hrobertv表示--hive-overwrite
不会删除现有的dir但会覆盖hive表的HDFS数据位置。如果要将新数据保存在与源相同的位置,而不是先删除现有表dir,然后运行sqoop import,并为--target-dir
指定--warehouse-dir
或--hive-overwrite
来存储数据根据您的要求在特定地点......