sqoop EXPORT - 在目标表中找不到列

Posted

技术标签:

【中文标题】sqoop EXPORT - 在目标表中找不到列【英文标题】:sqoop EXPORT - There is no column found in the target table 【发布时间】:2015-11-02 21:27:05 【问题描述】:

我编写了一个简单的脚本来创建一个用户 (TestV100),在该架构中创建一个表 (Xy100),并将一个制表符分隔的平面文件从 hadoop 导出到这个 oracle 表。

这是 shell 脚本:- ExportOracleTestV100.sh

#!/bin/bash

# Testing connectivity to Oracle DB
#sqoop eval --connect jdbc:oracle:thin:@hostname:1521:orcl -username test -password password --query "SELECT count(*) as bob FROM \"TestV1\".\"Test\"" --verbose

HOST=$1
USER=$2
PASS=$3
SCHEMA=$4
PORT=$5
SID=$6
SQOOP=/usr/bin/sqoop
JDBC="jdbc:oracle:thin:@$1:$5:$6"
SQOOP_EVAL="$SQOOP eval --connect $JDBC --username $USER --password $PASS --query"

#Create Schema and Tables;
$SQOOP_EVAL "CREATE USER \"TestV100\" identified by \"password\""
$SQOOP_EVAL "GRANT CONNECT TO \"TestV100\""
$SQOOP_EVAL "ALTER USER \"TestV100\" QUOTA UNLIMITED ON USERS"

$SQOOP_EVAL "DROP TABLE \"TestV100\".\"Xy100\""
$SQOOP_EVAL "CREATE TABLE \"TestV100\".\"Xy100\"( \"a\" NVARCHAR2(255) DEFAULT NULL, \"x\" NUMBER(10,0) DEFAULT NULL, \"y\" NUMBER(10,0) DEFAULT NULL )"


############################
## Load Data into tables; ##
############################

SQOOP_EXPORT="/usr/bin/sudo -u hdfs $SQOOP export --connect $JDBC --username $USER --password $PASS --export-dir"
$SQOOP_EXPORT "/tmp/rv/TestV100/xy100.txt" --table "\"\"$SCHEMA\".\"Xy100\"\"" --fields-terminated-by "\t" --input-null-string null -m 1

这是输入文件:- cat /tmp/rv/TestV100/Xy100.txt

c       8       3
a       1       4
c       6       1
c       2       0
a       7       7
c       4       2
c       7       5
a       0       0
c       5       6
a       2       2
a       5       5
a       3       6
c       9       7
a       4       1
c       3       4
a       6       3
b       6       5
b       8       7
b       5       1
b       7       3
b       2       4
b       1       0
b       4       6
b       3       2

这是调用 shell 脚本的方式:

sh ./ExportOracleTestV100.sh oracle11 test password TestV100 1521 orcl --verbose

注意:“test”用户对 TestV100 架构具有完全访问权限。

输出:

[root@abc-repo-app1 rv]# sh ./ExportOracleTestV100.sh oracle11 test password TestV100 1521 orcl --verbose
Warning: /usr/lib/sqoop/../accumulo does not exist! Accumulo imports will fail.
Please set $ACCUMULO_HOME to the root of your Accumulo installation.
15/11/02 12:40:07 INFO sqoop.Sqoop: Running Sqoop version: 1.4.5-cdh5.4.1
15/11/02 12:40:07 WARN tool.BaseSqoopTool: Setting your password on the command-line is insecure. Consider using -P instead.
15/11/02 12:40:07 INFO oracle.OraOopManagerFactory: Data Connector for Oracle and Hadoop is disabled.
15/11/02 12:40:07 INFO manager.SqlManager: Using default fetchSize of 1000
15/11/02 12:40:07 INFO tool.CodeGenTool: Beginning code generation
15/11/02 12:40:08 INFO manager.OracleManager: Time zone has been set to GMT
15/11/02 12:40:08 INFO manager.SqlManager: Executing SQL statement: SELECT t.* FROM "TestV100"."xy100" t WHERE 1=0
15/11/02 12:40:08 ERROR sqoop.Sqoop: Got exception running Sqoop: java.lang.IllegalArgumentException: There is no column found in the target table "TestV100"."xy100". Please ensure that your table name is correct.
java.lang.IllegalArgumentException: There is no column found in the target table "TestV100"."xy100". Please ensure that your table name is correct.
        at org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1658)
        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:143)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
        at org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:179)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:218)
        at org.apache.sqoop.Sqoop.runTool(Sqoop.java:227)
        at org.apache.sqoop.Sqoop.main(Sqoop.java:236)

如上所示,Sqoop 版本为 1.4.5-cdh5.4.1

不知何故,我设法做到了这一点。我在网上看到很多关于 sqoop 导入和这个错误的帖子,解决方法是在命令中将表名更改为大写。但是,我正在运行导出。此外,必须使用混合大小写创建 oracle 表。

我希望我在这里提供了所有必需的信息。有人可以帮忙或指出一些可以帮助我克服这个错误的地方吗?

【问题讨论】:

添加更多:如果我以“测试”用户身份连接并运行完全相同的命令(SELECT t.* FROM “TestV100”.”xy100″ t WHERE 1=0),它可以正常工作sql开发者!所以,我确信用户有权限。 【参考方案1】:

大写的表名有效。

sqoop export --connect jdbc:oracle:thin:@xyzx:1569:xyz --username xyz --password xyz --table CIPHADOOPCUSTOMERREPORT --export-dir /apps/hive/warehouse/ciprpt.db/dtd_customer_report - -input-fields-terminated-by "\t" --input-lines-terminated-by "\n" --verbose -m 8 --input-null-string '\N' --input-null-non-字符串'\N'

【讨论】:

我认为 vjender 有正确的答案。我把它改成大写,它工作。顺便说一句,这似乎是 sqoop 的错误。【参考方案2】:

在 --table 参数中提供大写的表名。 听起来很傻,但是是的 - 使用大写的表名。

【讨论】:

【参考方案3】:

我遇到了这个问题,因为 sqoop 导出的目标表少了一列。 解决方案: 使用--columns 参数指定列列表;或重新生成目标表以匹配输入表的架构。

【讨论】:

以上是关于sqoop EXPORT - 在目标表中找不到列的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 11 Export for Localization 不起作用,Include Screenshots 功能被禁用,并且在测试日志中找不到 XCUITest 屏幕截图附件

在“vue”中找不到“导出”“Vue”

如果在 Hive SQL 中找不到匹配项,则提供要加入的备用列

在“vue”中找不到导出“默认”(导入为“vue”)

Sqoop 导出作业的 sqoop.export.records.per.statement 是不是有限制?

“在‘​​vue’中找不到导出‘createApp’