我正在尝试hadoop及其相关的东西 . 为此,我在Ubuntu机器中配置了hadoop,hase,hive,sqoop .
raghu@system4:~/sqoop$ bin/sqoop-import --connect jdbc:mysql://localhost:3306/mysql --username root --password password --table user --hive-import -m 1
一切顺利,但是当我进入hive命令行并执行show tables时,什么都没有 . 我能够看到这些表是在HDFS中创建的 .
我在Sqoop导入中看到了一些选项 - 它可以导入到Hive / HDFS / HBase . 导入Hive时,它确实直接导入HDFS . 那为什么Hive?
我在哪里可以执行HiveQL来检查数据 .
从cloudera支持,我明白我可以Hue并检查它 . 但是,我认为Hue只是Hive的用户界面 .
有人可以帮助我吗?
提前致谢,
Raghu
7 回答
当我们没有在sqoop import命令中给出任何数据库时,该表将在默认数据库中创建,其名称与RDBMS表名相同 . 您可以通过“--hive-database”指定要在hive中导入RDBMS表的数据库名称 .
您可以使用sqoop的create-hive-table命令在hive中导入表结构,而不是每次都创建Hive表 . 它将表导入为managed_table,然后您可以通过将表属性更改为外部表然后添加分区将该表转换为外部表 . 这将减少找到正确数据类型的工作量 . 请注意,将进行精确更改
我遇到了同样的问题 . 通过将数据直接导入HDFS,然后创建 External Hive表以指向HDFS中的特定位置,我能够解决/通过它 . 这是一个适合我的例子 .
您需要将位置更改为在HDFS中保存数据的位置 .
你能发布sqoop的输出吗?尝试使用--verbose选项 .
这是我使用的命令的一个示例,它确实直接导入到Hive表 .
每当您使用带有Hive导入选项的Sqoop时,sqoop直接连接相应的数据库的Metastore并获取相应表的元数据(表的模式),因此无需在Hive中创建表结构 . 此模式然后在与Hive-import选项一起使用时提供给Hive .
因此,HDFS上所有sqoop数据的输出默认存储在默认目录.i.e / user / sqoop / tablename / part-m files中
使用hive导入选项,表格将直接下载到默认仓库目录中,即
/ user / hive / warehouse / tablename命令:sudo -u hdfs hadoop fs -ls -R / user / this以递归方式列出用户中的所有文件 .
现在转到Hive并键入show databases.如果只有默认数据库,则键入show tables:remember OK是常见的默认系统输出,不是命令输出的一部分 .
hive> show databases;
好
默认
所用时间:0.172秒
hive> show tables;
好
类型
log_apache
电影
moviegenre
movierating
占用
用户
所用时间:0.111秒
尝试像这样的sqoop命令,它为我工作并直接创建hive表,你不需要每次都创建外部表
sqoop import --connect DB_HOST --username ***** --password ***** --query "select *from SCHEMA.TABLE where $CONDITIONS"
--num-mappers 5 --split-by PRIMARY_KEY --hive-import --hive-table HIVE_DB.HIVE_TABLE_NAME --target-dir SOME_DIR_NAME;
您使用的命令将数据导入$ HIVE_HOME目录 . 如果未设置HIVE_HOME环境变量或指向错误的目录,您将无法看到导入的表 .
找到hive主目录的最佳方法是使用Hive QL SET命令:
hive -S -e 'SET' | grep warehouse.dir
检索配置单元主目录后,将
--hive-home <hive-home-dir>
选项附加到命令中 .另一个可能的原因是,在一些Hive设置中,元数据被缓存,您无法立即看到更改 . 在这种情况下,您需要使用
INVALIDATE METADATA;
命令刷新元数据缓存 .