语句:
sqoop export --table tableName -connect jdbc:oracle:thin:@xx.xx.xx.xx:port:xxx --username userNameA --password pwd --export-dir sourceFile --input-fields-terminated-by '\001' --input-lines-terminated-by '\n'
sqoop导出数据到oracle:报错:
java.lang.IllegalArgumentException: Attempted to generate class with no columns!
at org.apache.sqoop.orm.ClassWriter.generateClassForColumns(ClassWriter.java:1295)
at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1176)
at org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:96)
at org.apache.sqoop.tool.ExportTool.exportTable(ExportTool.java:64)
at org.apache.sqoop.tool.ExportTool.run(ExportTool.java:100)
at org.apache.sqoop.Sqoop.run(Sqoop.java:145)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:181)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:220)
at org.apache.sqoop.Sqoop.runTool(Sqoop.java:229)
at org.apache.sqoop.Sqoop.main(Sqoop.java:238)
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.ShellMain], exit code [1]
*****************
2013-08-29 12:18:17,217 INFO org.apache.sqoop.manager.SqlManager: Executing SQL statement: SELECT t.* FROM TMP t WHERE 1=0
2013-08-29 12:18:17,235 ERROR org.apache.sqoop.Sqoop: Got exception running Sqoop: java.lang.IllegalArgumentException: Attempted to generate class with no columns!
查看Sqoop源码发现这么一段:
此异常是在没有找到目标表的column时抛出:
private StringBuilder generateClassForColumns(
Map<String, Integer> columnTypes,
String [] colNames, String [] dbWriteColNames) {
if (colNames.length ==0) {
throw new IllegalArgumentException("Attempted to generate class with "
+ "no columns!");
}
再查导致获取columns为空的原因,发现columns的获取是通过如下代码:
String [] colNames = options.getColumns();
if (null == colNames) {
if (null != tableName) {
// Table-based import. Read column names from table.
colNames = connManager.getColumnNames(tableName);
} else if (options.getCall() != null) {
// Read procedure arguments from metadata
colNames = connManager.getColumnNamesForProcedure(
this.options.getCall());
} else {
// Infer/assign column names for arbitrary query.
colNames = connManager.getColumnNamesForQuery(
this.options.getSqlQuery());
}
}
可以发现,它是先找参数columns的值,如果没有再去通过table去查。
通过table查寻是通过该table的owner去查:
见org.apache.sqoop.manager.OracleManager.java
中getColumnNames()方法:
conn = getConnection();
pStmt = conn.prepareStatement(QUERY_COLUMNS_FOR_TABLE,
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
pStmt.setString(1, tableOwner);
pStmt.setString(2, shortTableName);
rset = pStmt.executeQuery();
其主要查询语句为:
public static final String QUERY_COLUMNS_FOR_TABLE =
"SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE "
+ "OWNER = ? AND TABLE_NAME = ? ORDER BY COLUMN_ID";
在我的sqoop语句中并没有指定columns的值,它会理所当然的去查table的columns。
而我的table是同义词,其属主用户并非userNameA。
这下解决方式很明显了,两种:
1.将user替换成table的属主用户。
2.添加--columns属性,显示的指定columns的值。
分享到:
相关推荐
Sqoop导Oracle数据到Hive,代码清晰一目了然
sqoop问题处理通用办法,首先详细描绘了一个sqoop实际问题得处理过程,然后延申到完整得hadoop日志得处理过程。非常具体实用。
sqoop 从 hive 导到mysql遇到的问题.docx
NULL 博文链接:https://kingding.iteye.com/blog/2435018
出现此问题时使用:java.lang.NullPointerException at org.json.JSONObject.(JSONObject.java:144) at org.apache.sqoop.util.SqoopJsonUtil.... at org.apache.sqoop.Sqoop.main(Sqoop.java:252)
Hadoop HBbase HIVE Sqoop概念介绍说明,及和RDBMS的比较
2、sqoop导入(RMDB-mysql、sybase到HDFS-hive) 网址:https://blog.csdn.net/chenwewi520feng/article/details/130572275 介绍sqoop从关系型数据库mysql、sybase同步到hdfs、hive中
除了代码还有总结内容,代码主要实现了从sqoop1.99.7从oracle导出数据到HDFS某目录;总结内容是一些踩坑的总结,还有一些坑的说明在代码注释里;灵活利用,可以帮助你跑通oracle到hdfs的过程。
sqoop导入数据到hive
3、Sqoop导出(HDFS到RMDB-mysql) 网址:https://blog.csdn.net/chenwewi520feng/article/details/130573318 介绍通过sqoop将hdfs数据同步到关系型数据库mysql中
基于Sqoop+Hive+Spark+MySQL+AirFlow+Grafana的工业大数据离线数仓项目
sqoop2 java API从oracle导数据到HDFS开发总结 有了这个文档,会为你节省很多时间,一些我踩坑趟路的时间;但是不代表你什么都不知道的前提就能把demo运行起来 。 建议操作顺序:sqoop官方环境搭建文档看一遍,然后...
实战Sqoop数据导入及大数据用户行为案例分析...08_Sqoop将MySQL数据导入Hive表中 09_Sqoop的导出及脚本中使用的方式 10_案例分析-动态分区的实现 11_案例分析-源表的分区加载创建 12_案例分析-指标分析使用Sqoop导出
通过Sqoop+Hive+Hbase+Kettle+R一系列软件的简单实用和操作来帮助读者理解这些软件的用法
Hadoop hbase hive sqoop集群环境安装配置及使用文档
使用Sqoop在Oracle数据库和HDFS之间进行导入和导出 内容 使用 操作系统-Ubuntu 20.04.1 LTS(VMware) 后端-Java (JDK 1.8), Sqoop(v1.4.7) , Hadoop(v3.3.0) 库-OJDBC(v7),commons-lang-2.6.jar ...
利用sqoop导出oracle的数据时所需的驱动包,只需要将该包放到hive或sqoop的lib目录下即可。
Sqoop+Hive+MySQL 该项目将演示以下在 CDH5 中使用 sqoop 的核心概念 ...NYSE hadoop word 文档包含导入和导出数据的所有步骤和命令以及分步指南。 tar 文件包含我用于该项目的示例数据,它应该可以很好地表示整体
使用sqoop从传统数据库mysql中抽取数据到大数据集群。