这种问题遇到数据小时候还好办. 但是数据魇 时候就麻烦来了.
下面针对三种情况做具体情况的选择办法
先上一个图
[img]
[/img]
1. 当需要转换的数据特别大的时候, 例如: 10W条以上.或者100W条以上时.
上图中,hadoop数据导入,导入的数据如果够多,例如100W条以上,其中一个字段需要查询数据库中查询,而这个字段的类型并不多,例如只有10个类型或者数据库中就只有这10个类型.那么,可以走线路2, 并且线路2中的 "使用缓存" 可以打勾,也可以不打.当然你这个源里的数据太多,打上当然最好了.因为省得再去你的数据库里再查.
但是当源里的数据类型还是只有10个类型,但是你的数据库里面存了有10000条记录时,怎么办?
有两种解决办法:
1).线路2:并且查询节点中的 "使用缓存" 不能打勾.
2).线路1,并在"带条件的结果查询供流查询使用" 这个结点中,用一个SQL,过滤一下数据,然后尽可能地把那里包括的这些记录查出来.这样在流里的比对时.也很快很多.必竟是在内存里做运算了
2. 查另一个数据库的数据量大时,而你的源数据不大.
最好的选择是
线路1,并在"带条件的结果查询供流查询使用" 这个结点中,用一个SQL,过滤一下数据,然后尽可能地把那里包括的这些记录查出来.这样在流里的比对时.也很快很多.必竟是在内存里做运算了
3. 当两个数据源都非常大时(最不想遇到的)
这种情况是最不想遇到的办法
一种选择:
1).线路2中的 "使用缓存" 打勾.
当然还有别的更复杂但是会更快的办法.适用场景比较少,不再详细写了.
1.单数据源输入,直接用sql
做连接
2.
多数据源输入,(可能是文本或是两个以上源数据库),用database
join
*** 作.
3.
三个表以上的多字段输出.
2.
Kettle的数据库连接模式
Kettle的数据库连接是一个步骤里面控制一个单数据库连接,所以kettle的连接有数据库连接池,你可以在指定的数据库连接里面指定一开始连接池里面放多少个数据库连接,在创建数据库连接的时候就有Pooling
选项卡,里面可以指定最大连接数和初始连接数,这可以一定程度上提高速度.
linux 下,可以使用cli程序把csv文件导入到数据库。具体代码如下:
$ORACLE_HOME/bin/sqlplus -S username/password@instanceName > /dev/null 2>&1 <<!!#对sqlplus作一些设置,使之只输出我们需要的文本
set echo off
set pagesize 0
set verify off
set feedback off
set termout off
set linesize 3000
set trimspool on
#查询输出到临时文件
spool /tmp/some_tmp.csv
#select语句
select column1||','||column2||','||column3 ....
from some_table where condition
spool off
#这里可以添加多个查询,且每个查询可输出到不同的文件,如下面注释
#spool /tmp/some_tmp.csv
#select column1||','||column2||','||column3 ....
#from some_table where condition
#spool off
set markup HTML off
quit
!!
#计算记录总行数,如果是0则不发邮件
NUM=`cat /tmp/some_tmp.csv | wc -l`
if[ $NUM -gt 0 ]
then
#先写excel的每列的title
echo 'Title_Of_Column1, Title_Of_Column2, ....Title_Of_ColumnN' > /tmp/attachement.csv
#数据正文
cat /tmp/some_tmp.csv >> /tmp/attachement.csv
#发邮件
(
echo "From: user@somehost.com"
echo "To: user1@somehost.com"
echo "MIME-Version: 1.0"
echo "Content-Type: multipart/mixed"
echo ' boundary="A_Boundary_Name_You_Can_Change_It"'
echo "Subject: Subject"
echo ""
echo ""
#附件分隔符,上面的boundary前面加--
echo "--A_Boundary_Name_You_Can_Change_It"
echo 'Content-Transfer-Encoding: x-uuencode'
echo 'Content-Type: text/csv'
echo ' name="attachement.csv"'
echo 'Content-Disposition: attachment'
echo ' filename="attachement.csv"'
echo ""
uuencode /tmp/attachement.csv attachement.csv
echo "--A_Boundary_Name_You_Can_Change_It"
#附件结束
) | mailx -t
fi
#删除临时文件
rm -f /tmp/*.csv
exit 0
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)