Sqoop:双引号查询

时间:2015-09-17 15:45:09

标签: sql sqoop double-quotes

我的sqoop查询上有双引号问题:

select i.Number, i.Date,i.Station, i.lStation, 
count(*) ax, “1- Pd” St  , b.Type 
from Leg jl, yLeg i, senger b, 
where jl.LegID = i.LegID and jl.rID = b.erID and b.gID = b.ID  
and b.tus not in (1,4) group by Number, Date, tion, b.Type

我该怎么办?带一些转义参数

2 个答案:

答案 0 :(得分:1)

首先使用以下命令调试查询sqoop eval -libjars /var/lib/sqoop/ojdbc6.jar --connect jdbc:oracle:thin:@hostname:portnumber/servicename --username user -password password --query "select * from schemaname.tablename where rownum=10"在--query中编写查询并查看实际查询是否正在生成您期望的输出?你可以看到终端本身的输出。

如果查询按预期给出结果,请使用以下sqoop命令 导入表

sqoop import -libjars /var/lib/sqoop/ojdbc6.jar --connect 'jdbc:oracle:thin:@hostname/service_name' --username user -password password -m 1 --hive-overwrite --hive-import --hive-database database_name --hive-table table_nmae --target-dir '/user/hive/warehouse/databasename.db/tablename' --query "select * from source_database.source_tablename WHERE 1=1 AND \$CONDITIONS"

使用转义键可以解决您所面对的双引号的确切问题。请按原样 WHERE 1 = 1 AND \ $ CONDITIONS 并将您的查询粘贴到sqoop命令中的 WHERE 之前。

如果您遇到任何错误请粘贴错误,您必须添加其他转义键才能转义双引号。

答案 1 :(得分:0)

这个问题分为两部分。

第一个是源数据库的有效查询是什么?大多数数据库都有某种客户端或shell,可以让您输入和执行查询。就shell或客户端而言,您的查询应该是有效的。

问题的第二部分是如何将该查询(作为字符串)并通过sqoop传递给数据库。答案就在于你运行sqoop的方式。

如果您通过命令行运行sqoop,那么您需要识别那些在嵌入命令行参数时使您的操作系统适合的字符(通常是双引号)。在这些字符之前使用反斜杠来帮助操作系统正确解析命令。您通常必须将整个查询字符串放在未转义的双引号内,以便操作系统将您的查询视为单个字符串参数。

如果您通过Oozie运行sqoop,那么我强烈建议您将Sqoop命令分解为Sqoop操作中的参数:

<arg>--query</arg>
<arg>select ... count(*) ax, “1- Pd” St  , b.Type ...  WHERE $CONDITIONS</arg>

因此,您通常可以将查询按原样粘贴到操作中。

当然,没有什么是那么简单。您仍然需要记住查询位于XML文档中,因此任何会破坏XML解析的字符都会出现问题。到目前为止,我遇到过的唯一一个字符是尖括号,我使用属性替换(我承认有点像kludge)来解决这个问题:

在Oozie工作流属性文件中,我放了:

lessThan=<

我从

更改我的arg
<arg>SELECT * from MyTable where $CONDITIONS AND (SOME_COL < 1000)</arg>

<arg>SELECT * from MyTable where $CONDITIONS AND (SOME_COL ${lessThan} 1000)</arg>

编辑:

对于那些不喜欢我的kludge的人,你可以尝试使用CDATA元素来逃避&#34;查询中的任何内容(当然除了&#39;]]&gt;&#39;):

<arg><![CDATA[SELECT * from MyTable where $CONDITIONS AND (SOME_COL < 1000)]]></arg>