在hadoop上使用sqoop import命令时出现错误

时间:2019-11-17 18:18:17

标签: mysql hadoop sqoop

您好,我正在使用下面的sqoop命令,我认为应该可以使用

[cloudera@quickstart ~]$ sqoop import --connect jdbc:mysql://quickstart.cloudera:3306/retail_db --username root --password cloudera --query "select * from customers where customer_street like '%Plaza%' AND $CONDITIONS" --target-dir /user/cloudera/problem1/customers/textdata --fields-terminated-by '*' --lines-terminated-by '|' --as-textfile --columns "customer_id,customer_fname,customer_lname,customer_street" --split-by "customer_id"

但是我遇到了与$ condition相关的错误,我认为该错误已正确实现..请帮助..谢谢

  

警告:/usr/lib/sqoop/../accumulo不存在! Accumulo进口   将失败。请将$ ACCUMULO_HOME设置为Accumulo的根   安装。 17/11/17 10:12:10信息sqoop.Sqoop:正在运行的Sqoop   版本:1.4.6-cdh5.13.0 19/11/17 10:12:10 WARN工具.BaseSqoopTool:   在命令行上设置密码不安全。考虑使用   -P代替。 17/11/17 10:12:10 INFO manager.MySQLManager:准备使用MySQL流式结果集。 17/11/11 10:12:10信息   tool.CodeGenTool:开始生成代码19/11/17 10:12:10错误   tool.ImportTool:导入失败:java.io.IOException:查询[选择*   来自客户的客户,其中customer_street(如“%Plaza%” AND)必须包含   WHERE子句中的“ $ CONDITIONS”。在   org.apache.sqoop.manager.ConnManager.getColumnTypes(ConnManager.java:332)     在   org.apache.sqoop.orm.ClassWriter.getColumnTypes(ClassWriter.java:1858)     在org.apache.sqoop.orm.ClassWriter.generate(ClassWriter.java:1657)     在   org.apache.sqoop.tool.CodeGenTool.generateORM(CodeGenTool.java:106)     在org.apache.sqoop.tool.ImportTool.importTable(ImportTool.java:494)     在org.apache.sqoop.tool.ImportTool.run(ImportTool.java:621)处   org.apache.sqoop.Sqoop.run(Sqoop.java:147)在   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)

2 个答案:

答案 0 :(得分:1)

您好,以下内容应该有效

@cython.boundscheck(False)
@cython.wraparound(False)
def packlist(a):
    out = bytearray(4*len(a))
    cdef int[::1] outview = memoryview(out).cast('i')
    cdef int i
    for i in range(len(a)):
        outview[i] = a[i]
    return bytes(out)

答案 1 :(得分:0)

请参阅SqoopUserGuide中的“ 7.2.3。自由格式查询导入”

自由格式选择查询中的Sqoop --query选项需要$ CONDITIONS,并且在sqoop用户指南Notes中需要注意的地方很少。

  1. 基于--query选项中用于查询的报价,我们需要使用$ CONDITIONS或\ $ CONDITIONS,如下所示。由于您使用了双引号,因此必须使用\ $ CONDITIONS来避免替换。

示例:

使用单个映射器时,整个所选数据将由一个映射器顺序传输。

 --query 'SELECT * FROM a WHERE $CONDITIONS' -m 1 

如果使用双引号,则需要添加\以避免替换。

 --query "SELECT * FROM a WHERE \$CONDITIONS" -m 1 

当使用多个映射器时,基于--split-by子句拆分并替换$ CONDITIONS之后,所有映射器将并行传输所选数据。

 --query 'SELECT * FROM a WHERE $CONDITIONS' -m 3 --split-by a.column 
  1. 可以使用--query参数指定SQL语句,而不是使用--table,--columns和--where参数。因此,应从命令中删除--columns,并使用-m或--num-mappers传递映射器的数量。