我用sqoop从oracle导入数据到hdfs时,总是报 表或视图不存在错误,求解答...

我用sqoop从oracle导入数据到hdfs时,总是报 表或视图不存在错误,求解答...,第1张

通过配置本地数据库的tns配置文件实现:

去oracle安装目录下oracle\product\1020\db_2\NETWORK\ADMIN\ 找到tnsnamesora,用记事本打开,里边有远程数据库的tns连接配置串如下

ORCL23 =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192168323)(PORT = 1521))

)

(CONNECT_DATA =

(SID = ORCL)

)

)

添加好ip、端口和目标数据库的实例名(SID),然后确保tns名称(ORCL23)在整个文档中唯一,保存后打开数据库连接工具,输入远程数据库上的用户名密码,选择数据库对象为你配置的连接名就可以了

Hibernate分页

Hibernate中,通过对不同数据库的统一接口设计,实现了透明化、通用化的分页实现机制。

通过CriteriasetFirstResult和CriteriasetFetchSize方法设定分页范围,如:

Criteria criteria = sessioncreateCriteria(TUserclass);

criteriaadd(Expressioneq("age", "20"));

//从检索结果中获取第100条记录开始的20条记录

criteriasetFirstResult(100);

criteriasetFetchSize(20);

通过QuerysetFirstResult和QuerysetMaxResults方法也可以设定分页范围,如:

Query query = sessioncreateQuery("from TUser");

querysetFirstResult(100);

querysetMaxResults(20); // querysetFetchSize(20);

List list = querylist();

Hibernate中,抽象类orghibernatedialectDialect指定了所有底层数据库的对外统一接口,通过针对不同数据库提供相应的Dialect实现,数据库之间的差异性得以消除,从而为上层机制提供了透明的、数据库无关的存储层基础。

对于分页机制而言,Dialect中定义了一个方法如下:

/

Add a LIMIT clause to the given SQL SELECT

@return the modified SQL

/

public String getLimitString(String querySelect, boolean hasOffset) {

throw new UnsupportedOperationException( "paged queries not supported" );

}

public String getLimitString(String querySelect, int offset, int limit) {

return getLimitString( querySelect, offset>0 );

}

此方法用于在现有Select语句基础上,根据各个数据库自身特性,构造对应的记录返回限定子句。如MySQL中对应的记录限定子句为Limit,Oracle中,通过rownum子句实现。

MySQLDialect中的getLimitString实现:

public String getLimitString(String sql, boolean hasOffset) {

return new StringBuffer( sqllength()+20 )

append(sql)

append( hasOffset " limit , " : " limit ")

toString();

}

MySQLDialectgetLimitString方法的实现实际上是在给定的Select语句后追加MySQL所提供的专有SQL子句limit来实现。

Oracle9Dialect中的getLimitString实现:

public String getLimitString(String sql, boolean hasOffset) {

sql = sqltrim();

boolean isForUpdate = false;

if ( sqltoLowerCase()endsWith(" for update") ) {

sql = sqlsubstring( 0, sqllength()-11 );

isForUpdate = true;

}

StringBuffer pagingSelect = new StringBuffer( sqllength()+100 );

if (hasOffset) {

pagingSelectappend("select from ( select row_, rownum rownum_ from ( ");

}

else {

pagingSelectappend("select from ( ");

}

pagingSelectappend(sql);

if (hasOffset) {

pagingSelectappend(" ) row_ where rownum <= ) where rownum_ > ");

}

else {

pagingSelectappend(" ) where rownum <= ");

}</p> <p> if ( isForUpdate ) {

pagingSelectappend( " for update" );

}

return pagingSelecttoString();

}

通过Oracle特有的rownum子句来实现数据部分的读取。</p> <p>SQLServerDialect中的getLimitString实现:

public String getLimitString(String querySelect, int offset, int limit) {

if ( offset > 0 ) {

throw new UnsupportedOperationException( "sql server has no offset" );

}

return new StringBuffer( querySelectlength()+8 )

append(querySelect)

insert( getAfterSelectInsertPoint(querySelect), " top " + limit )

toString();

}

通过SQLServer特有的top子句实现。</p> <p>HSQLDialect中的getLimitString实现:

public String getLimitString(String sql, boolean hasOffset) {

return new StringBuffer( sqllength() + 10 )

append( sql )

insert( sqltoLowerCase()indexOf( "select" ) + 6, hasOffset " limit " : " top " )

toString();

}</p> <p>

大多数主流数据库都提供了数据部分读取机制,而对于某些没有提供相应机制的数据库而言,Hibernate也通过其他途径实现了分页,如通过Scrollable ResultSet,如果JDBC不支持Scrollable ResultSet,Hibernate也会通过ResultSet的next方法进行记录定位。</p> <p>Hibernate通过底层对分页机制的良好封装,使得开发人员无需关心数据分页的细节实现,将数据逻辑和存储逻辑分离开来,在提高生产效率的同时,也大大加强了系统在不同数据库平台之间的可移植性。</p> <p>

抄袭资料:《深入浅出Hibernate》

Hibernate reference

Hibernate api

Hibernate src </p>

<p id="TBPingURL">

setFetchSize()

是设置ResultSet每次向数据库取的行数

但是你要这样还是可以把所有的数据都取出来,这个只是优化了,取不完数据的情况下

setMaxRows()

是设置Resultset最多返回的行数

用下面这个方法才能满足你的要求

查找某个表的总行数,用 select count() from table是一个好的想法。从结果中得到行值就能获取 table的总行数。然而,如果不用这个方法,想要直接返回行数的方法是没有的,毕竟jdbc是统一的标准,这个标准接口里面没有直接返回table总行数的方法,这点要理解。然而如果能得到ResultSet (内存模拟的视图)可以用 getFetchSize得到总行数。这个方法并不能完全的满足你的要求,但您得明白,对于没有直接提供的方法,除了用某些手段,我们无可奈何。 getFetchSizeint getFetchSize() throws SQLException 获取此 ResultSet 对象的获取大小。 </dd>返回: 此 ResultSet 对象的当前获取大小 抛出: SQLException - 如果发生数据库访问错误或在已关闭的结果集上调用此方法getFetchSize() 这个方法

以上就是关于我用sqoop从oracle导入数据到hdfs时,总是报 表或视图不存在错误,求解答...全部的内容,包括:我用sqoop从oracle导入数据到hdfs时,总是报 表或视图不存在错误,求解答...、在J2EE的Spring+Hibernate+Struts模式中如何用回调接口办法实现分页、Statement 与 ResultSet setFetchSize 是做什么用的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/9432121.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存