【问题标题】:How to pass column names having spaces to sqoop --map-column-java如何将包含空格的列名传递给 sqoop --map-column-java
【发布时间】:2019-07-29 10:22:03
【问题描述】:

我必须使用 sqoop 导入数据,我的源列名称之间有空格,所以当我在 --map-column-java 参数中添加它时出现错误。

Sqoop 导入示例:

sqoop import --connect jdbc-con --username "user1" --query "select * from table where \$CONDITIONS" --target-dir /target/path/ -m 1 --map-column-java data col1=String, data col2=String, data col3=String --as-avrodatafile

列名:

data col1,
data col2,
data col3

错误:

19/03/07 07:31:55 调试 sqoop.Sqoop:格式错误的映射。列映射应该是 key=value[,key=value]* 的形式 java.lang.IllegalArgumentException:格式错误的映射。列映射应该是 key=value[,key=value]* 的形式 在 org.apache.sqoop.SqoopOptions.parseColumnMapping(SqoopOptions.java:1355) 在 org.apache.sqoop.SqoopOptions.setMapColumnJava(SqoopOptions.java:1375) 在 org.apache.sqoop.tool.BaseSqoopTool.applyCodeGenOptions(BaseSqoopTool.java:1363) 在 org.apache.sqoop.tool.ImportTool.applyOptions(ImportTool.java:1011) 在 org.apache.sqoop.tool.SqoopTool.parseArguments(SqoopTool.java:435) 在 org.apache.sqoop.Sqoop.run(Sqoop.java:135) 在 org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) 在 org.apache.sqoop.Sqoop.runSqoop(Sqoop.java:183) 在 org.apache.sqoop.Sqoop.runTool(Sqoop.java:234) 在 org.apache.sqoop.Sqoop.runTool(Sqoop.java:243) 在 org.apache.sqoop.Sqoop.main(Sqoop.java:252) 格式错误的映射。列映射的形式应该是 key=value[,key=value]*

【问题讨论】:

  • 这个答案会对你有所帮助。 sqoop issue with space column name
  • 我尝试通过传递data col得到 col not found 错误。
  • 尝试如下: sqoop import --connect jdbc-con --username "user1" --query "select * from table where \$CONDITIONS" --target-dir /target/path/ - m 1 --map-column-java "datacol1=String, datacol2=String, datacol3=String"--as-avrodatafile 出现错误:ERROR tool.ImportTool: Import failed: Cannot convert SQL type 2005
  • 尝试传递 --map-column-java 中的所有列,仍然抛出错误:ERROR tool.ImportTool: Import failed: Cannot convert SQL type 2005
  • 我们有 3 列类型为 2005:找到类型为 [2005, 2147483647, 0] 的 COLNAME。我看到 SQL 服务器中该 COL 的数据类型是 nvarchar,max_length = -1 所以我尝试在这些 col 上使用 map-col-java 将它们转换为字符串。仍然出现同样的错误。

标签: hadoop sqoop avro


【解决方案1】:

能够解决这个问题:

1.空间问题: sqoop import --connect jdbc-con --username "user1" --query "select * from table where \$CONDITIONS" --target-dir /target/path/ -m 1 --map-column-java "data col1 =String, data col2=String, data col3=String" --as-avrodatafile

2。 ERROR tool.ImportTool:导入失败:无法转换 SQL 类型 2005: 源代码中的 3 列是 2005,nvarchar 在 --map-column-java 中添加它们解决了这个问题

3。 org.apache.avro.file.DataFileWriter$AppendWriteException: org.apache.avro.UnresolvedUnionException: Not in union ["null","long"]: 1****

这是由于在select查询中使用*造成的,所以将sqoop查询修改为:

sqoop import --connect jdbc-con --username "user1" --query "select [col1,data col2,data col3] from table where \$CONDITIONS" --target-dir /target/path/ -m 1 --map-column-java "data col1=String, data col2=String, data col3=String" --as-avrodatafile

【讨论】:

    【解决方案2】:

    你可以使用这个方法而不是使用 我用过,效果很好

    在这里我将列转换为字符串,以便时间戳无法更改为 int

    记住这一点,它将帮助你正确地制作你的字符串

    address = <localhost/server-ip-address/>
    
    port = put your database port number
    

    Sqoop 需要逗号分隔的映射列表,格式为 'name of column'='new type'

    columns-name =  give your database column name of timestamp or date time to date
    
    
    database-name = give your datbase name 
    
    database-user-name = put your user name 
    
    password = put your password 
    

    正确理解代码的演示

    sqoop import  --map-column-java "columns-name=String"    --connect jdbc:postgresql://address:port/database-name     --username user-name     --password  database-password --query "select * from demo where \$CONDITIONS;"  -m 1 --target-dir /jdbc/star --as-parquetfile  --enclosed-by '\"'
    

    单列代码演示

    sqoop import  --map-column-java "date_of_birth=String"    --connect jdbc:postgresql://192.168.0.1:1928/alpha     --username postgres     --password  mysecretpass --query "select * from demo where \$CONDITIONS;"  -m 1 --target-dir /jdbc/star --as-parquetfile  --enclosed-by '\"'
    

    处理多列的代码演示

    sqoop import  --map-column-java "date_of_birth=String,create_date=String"    --connect jdbc:postgresql://192.168.0.1:1928/alpha     --username postgres     --password  mysecretpass --query "select * from demo where \$CONDITIONS;"  -m 1 --target-dir /jdbc/star --as-parquetfile  --enclosed-by '\"'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 2017-10-28
      • 1970-01-01
      • 2013-08-23
      相关资源
      最近更新 更多