最近在hadoop实际使用中有以下几个小细节分享: i=m5M]Ef 1 中文问题 从url中解析出中文,但hadoop中打印出来仍是乱码?我们曾经以为hadoop是不支持中文的,后来经过查看源代码,发现hadoop仅仅是不支持以gbk格式输出中文而己。
这是TextOutputFormat.class中的代码,hadoop默认的输出都是继承自FileOutputFormat来的,FileOutputFormat的两个子类一个是基于二进制流的输出,一个就是基于文本的输出TextOutputFormat。
public class TextOutputFormat<K, V> extends FileOutputFormat<K, V> { protected static class LineRecordWriter<K, V> &E{CQ#k implements RecordWriter<K, V> { private static final String utf8 = “UTF-8″;//这里被写死成了utf-8 2 kP0// private static final byte[] newline; kTC'`xv static { :htz] try { 0 _!')+ newline = “/n”.getBytes(utf8); Ry$zF~[ } catch (UnsupportedEncodingException uee) { throw new IllegalArgumentException(”can’t find ” + utf8 + ” encoding”); } } … k-:wM`C public LineRecordWriter(DataOutputStream out, String keyValueSeparator) { this.out = out; try { this.keyValueSeparator = keyValueSeparator.getBytes(utf8); } catch (UnsupportedEncodingException uee) { @r.w+E= throw new IllegalArgumentException(”can’t find ” + utf8 + ” encoding”); } } ab}Kt($ … private void writeObject(Object o) throws IOException { if (o instanceof Text) { Text to = (Text) o; out.write(to.getBytes(), 0, to.getLength());//这里也需要修改 q&DM*!Jq } else { 5 O't-' out.write(o.toString().getBytes(utf8)); } } … qxQuXF>:# } |3bCq(ZR/P 可以看出hadoop默认的输出写死为utf-8,因此如果decode中文正确,那么将Linux客户端的character设为utf-8是可以看到中文的。因为hadoop用utf-8的格式输出了中文。 因为大多数数据库是用gbk来定义字段的,如果想让hadoop用gbk格式输出中文以兼容数据库怎么办? _.{I1*6Y2 我们可以定义一个新的类: .c5)` public class GbkOutputFormat<K, V> extends FileOutputFormat<K, V> { sTS Nu+ protected static class LineRecordWriter<K, V> implements RecordWriter<K, V> { //写成gbk即可 F"ua`ercI private static final String gbk = “gbk”; private static final byte[] newline; static { try { newline = “/n”.getBytes(gbk); } catch (UnsupportedEncodingException uee) { @}<b42 throw new IllegalArgumentException(”can’t find ” + gbk + ” encoding”); } } … SjL&/), public LineRecordWriter(DataOutputStream out, String keyValueSeparator) { P?o|N<46 this.out = out; X-<l+WP try { 0,]m.)ws this.keyValueSeparator = keyValueSeparator.getBytes(gbk); Js'j}w } catch (UnsupportedEncodingException uee) { throw new IllegalArgumentException(”can’t find ” + gbk + ” encoding”); } } J|aU}Z8m … /(&UDG$ private void writeObject(Object o) throws IOException { if (o instanceof Text) { // Text to = (Text) o; // out.write(to.getBytes(), 0, to.getLength()); +A-z>T( // } else { @h,3"2W{Ev out.write(o.toString().getBytes(gbk)); } } isU4D … eL_Il.: } 然后在mapreduce代码中加入conf1.setOutputFormat(GbkOutputFormat.class) 即可以gbk格式输出中文。
2 关于计算过程中的压缩和效率的对比问题 hf//2Vl 之前曾经介绍过对输入文件采用压缩可以提高部分计算效率。现在作更进一步的说明。 为什么压缩会提高计算速度?这是因为mapreduce计算会将数据文件分散拷贝到所有datanode上,压缩可以减少数据浪费在带宽上的时间,当这些时间大于压缩/解压缩本身的时间时,计算速度就会提高了。 hadoop的压缩除了将输入文件进行压缩外,hadoop本身还可以在计算过程中将map输出以及将reduce输出进行压缩。这种计算当中的压缩又有什么样的效果呢? 测试环境:35台节点的hadoop cluster,单机2 CPU,8 core,8G内存,redhat 2.6.9, 其中namenode和second namenode各一台,namenode和second namenode不作datanode 输入文件大小为2.5G不压缩,records约为3600万条。mapreduce程序分为两个job: ;R]~9Aan job1:map将record按user字段作key拆分,reduce中作外连接。这样最后reduce输出为87亿records,大小540G job2:map读入这87亿条数据并输出,reduce进行简单统计,最后的records为2.5亿条,大小16G 计算耗时54min
仅对第二个阶段的map作压缩(第一个阶段的map输出并不大,没有压缩的必要),测试结果:计算耗时39min
可见时间上节约了15min,注意以下参数的不同。 U&W/Nj 不压缩时: Local bytes read=1923047905109 :3[;9xCHj Local bytes written=1685607947227 "j8`)XXa( 压缩时: /U>|^$4 #5 Local bytes read=770579526349 |RL/2j| Local bytes written=245469534966 本地读写的的数量大大降低了
至于对reduce输出的压缩,很遗憾经过测试基本没有提高速度的效果。可能是因为第一个job的输出大多数是在本地机上进行map,不经过网络传输的原因。 附:对map输出进行压缩,只需要添加 jobConf.setMapOutputCompressorClass(DefaultCodec.class)
3 关于reduce的数量设置问题 reduce数量究竟多少是适合的。目前测试认为reduce数量约等于cluster中datanode的总cores的一半比较合适,比如 cluster中有32台datanode,每台8 core,那么reduce设置为128速度最快。因为每台机器8 core,4个作map,4个作reduce计算,正好合适。 u/(>a 附小测试:对同一个程序 j&[u$P*K reduce num=32,reduce time = 6 min reduce num=128, reduce time = 2 min reduce num=320, reduce time = 5min
4某次正常运行mapreduce实例时,抛出错误
java.io.IOException: All datanodes xxx.xxx.xxx.xxx:xxx are bad. Aborting…
at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.processDatanodeError(DFSClient.java:2158)
at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.access$1400(DFSClient.java:1735)
at org.apache.hadoop.dfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:1889)
java.io.IOException: Could not get block locations. Aborting…
at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.processDatanodeError(DFSClient.java:2143)
at org.apache.hadoop.dfs.DFSClient$DFSOutputStream.access$1400(DFSClient.java:1735)
at org.apache.hadoop.dfs.DFSClient$DFSOutputStream$DataStreamer.run(DFSClient.java:1889)
经查明,问题原因是linux机器打开了过多的文件导致。用命令ulimit -n可以发现linux默认的文件打开数目为1024,修改/ect/security/limit.conf,增加hadoop soft 65535
再重新运行程序(最好所有的datanode都修改),问题解决
P.S:据说hadoop dfs不能管理总数超过100M个文件,有待查证
5 运行一段时间后hadoop不能stop-all.sh的问题,显示报错
no tasktracker to stop ,no datanode to stop
问题的原因是hadoop在stop的时候依据的是datanode上的mapred和dfs进程号。而默认的进程号保存在/tmp下,linux 默认会每隔一段时间(一般是一个月或者7天左右)去删除这个目录下的文件。因此删掉hadoop-hadoop-jobtracker.pid和 hadoop-hadoop-namenode.pid两个文件后,namenode自然就找不到datanode上的这两个进程了。
在配置文件中的export HADOOP_PID_DIR可以解决这个问题
这里还有个文章, 提及了几个hadoop/mapred的优化细节
http://thethethethethethe.spaces.live.com/blog/cns!A001241972EA08EA!228.entry
linux中用shell获取昨天、明天或多天前的日期:在Linux中对man date -d 参数说的比较模糊,以下举例进一步说明:# -d, --date=STRING display time described by STRING, not `now’[root@Gman root]# date -d next-day +%Y%m%d #明天日期20091024[root@Gman root]# date -d last-day +%Y%m%d #昨天日期20091022[root@Gman root]# date -d yesterday +%Y%m%d #昨天日期20091022[root@Gman root]# date -d tomorrow +%Y%m%d # 明天日期20091024[root@Gman root]# date -d last-month +%Y%m #上个月日期200909[root@Gman root]# date -d next-month +%Y%m #下个月日期200911[root@Gman root]# date -d next-year +%Y #明年日期2010DATE=$(date +%Y%m%d --date ’2 days ago’) #获取昨天或多天前的日期名称 : date使用权限 : 所有使用者使用方式 : date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=datestr] [--set=datestr] [--help] [--version] [+FORMAT] [MMDDhhmm[[CC]YY][.ss]]说明 : date 能用来显示或设定系统的日期和时间,在显示方面,使用者能设定欲显示的格式,格式设定为一个加号后接数个标记,其中可用的标记列表如下 :时间方面 :% : 印出% %n : 下一行%t : 跳格%H : 小时(00..23)%I : 小时(01..12)%k : 小时(0..23)%l : 小时(1..12)%M : 分钟(00..59)%p : 显示本地 AM 或 PM%r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数 %S : 秒(00..61)%T : 直接显示时间 (24 小时制)%X : 相当于 %H:%M:%S%Z : 显示时区日期方面 :%a : 星期几 (Sun..Sat)%A : 星期几 (Sunday..Saturday)%b : 月份 (Jan..Dec)%B : 月份 (January..December)%c : 直接显示日期和时间%d : 日 (01..31)%D : 直接显示日期 (mm/dd/yy)%h : 同 %b%j : 一年中的第几天 (001..366)%m : 月份 (01..12)%U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形)%w : 一周中的第几天 (0..6)%W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形)%x : 直接显示日期 (mm/dd/yy)%y : 年份的最后两位数字 (00.99)%Y : 完整年份 (0000..9999)若是不以加号作为开头,则表示要设定时间,而时间格式为 MMDDhhmm[[CC]YY][.ss],其中 MM 为月份,DD 为日,hh 为小时,mm 为分钟,CC 为年份前两位数字,YY 为年份后两位数字,ss 为秒数把计 :-d datestr : 显示 datestr 中所设定的时间 (非系统时间)--help : 显示辅助讯息-s datestr : 将系统时间设为 datestr 中所设定的时间-u : 显示目前的格林威治时间--version : 显示版本编号例子 :显示时间后跳行,再显示目前日期 : date +%T%n%D显示月份和日数 : date +%B %d显示日期和设定时间(12:34:56) : date --date 12:34:56设置系统当前时间(12:34:56):date --s 12:34:56注意 : 当你不希望出现无意义的 0 时(比如说 1999/03/07),则能在标记中插入 - 符号,比如说 date +%-H:%-M:%-S 会把时分秒中无意义的 0 给去掉,像是原本的 08:09:04 会变为 8:9:4。另外,只有取得权限者(比如说 root)才能设定系统时间。 当你以 root 身分更改了系统时间之后,请记得以 clock -w 来将系统时间写入 CMOS 中,这样下次重新开机时系统时间才会持续抱持最新的正确值。ntp时间同步linux系统下默认安装了ntp服务,手动进行ntp同步如下ntpdate ntp1.nl.net当然,也能指定其他的ntp服务器-------------------------------------------------------------------扩展功能date 工具可以完成更多的工作,不仅仅只是打印出当前的系统日期。您可以使用它来得到给定的日期究竟是星期几,并得到相对于当前日期的相对日期。了解某一天是星期几GNU 对 date 命令的另一个扩展是 -d 选项,当您的桌上没有日历表时(UNIX 用户不需要日历表),该选项非常有用。使用这个功能强大的选项,通过将日期作为引号括起来的参数提供,您可以快速地查明一个特定的日期究竟是星期几:$ date -d "nov 22"Wed Nov 22 00:00:00 EST 2006$在本示例中,您可以看到今年的 11 月 22 日是星期三。所以,假设在 11 月 22 日召开一个重大的会议,您可以立即了解到这一天是星期三,而这一天您将赶到驻地办公室。获得相对日期d 选项还可以告诉您,相对于 当前日期若干天的究竟是哪一天,从现在开始的若干天或若干星期以后,或者以前(过去)。通过将这个相对偏移使用引号括起来,作为 -d 选项的参数,就可以完成这项任务。例如,您需要了解两星期以后的日期。如果您处于 Shell 提示符处,那么可以迅速地得到答案:$ date -d ’2 weeks’关于使用该命令,还有其他一些重要的方法。使用 next/last指令,您可以得到以后的星期几是哪一天:$ date -d ’next monday’ (下周一的日期)$ date -d next-day +%Y%m%d(明天的日期)或者:date -d tomorrow +%Y%m%d$ date -d last-day +%Y%m%d(昨天的日期) 或者:date -d yesterday +%Y%m%d$ date -d last-month +%Y%m(上个月是几月)$ date -d next-month +%Y%m(下个月是几月)使用 ago 指令,您可以得到过去的日期:$ date -d ’30 days ago’ (30天前的日期)您可以使用负数以得到相反的日期:$ date -d ’dec 14 -2 weeks’ (相对:dec 14这个日期的两周前的日期)$ date -d ’-100 days’ (100天以前的日期)$ date -d ’50 days’(50天后的日期)这个技巧非常有用,它可以根据将来的日期为自己设置提醒,可能是在脚本或 Shell 启动文件中,如下所示:DAY=`date -d ’2 weeks’ +"%b %d"`if test "`echo $DAY`" = "Aug 16"; then echo ’Product launch is now two weeks away!’; fi
Sybase字符串函数
长度和语法分析 datalength(char_expr) 在char_expr中返回字符的长度值,忽略尾空 substring(expression,start,length) 返回部分字符串 right(char_expr,int_expr) 返回char_expr右边的int_expr字符 基本字符串运算 upper(char_expr) 把char_expr转换成大写形式 lower(char_expr) 把char_expr转换成小写形式 space(int_expr) 生成有int_expr个空格的字符串 replicate(char_expr,int_expr) 重复char_expr,int_expr次 stuff(expr1,start,length,expr2) 用expr2代替epxr1中start起始长为length的字符串 reverse(char_expr) 反写char_expr中的文本 ltrim(char_expr) 删除头空 rtrim(char_expr) 删除尾空 格式转换 ascii(char_expr) 返回char_expr中第一个字符的ASCII值 char(int_expr) 把ASCII码转换为字符 str(float_expr[,length[,decimal]]) 进行数值型到字符型转换 soundex(char_expr) 返回char_expr的soundex值 difference(char_expr1,char_expr2) 返回表达式soundex值之差 串内搜索 charindex(char_expr,expression) 返回指定char_expr的开始位置,否则为0 patindex("%pattern%",expression) 返回指定样式的开始位置,否则为0 datalength用于确定可变字符串的长度 soundex用于确定字符串是否发音相似 difference返回0-4之间的值,0表示最不相似,4表示最相似 通配符 % 匹配任何数量的字符或无字符 _ 匹配任何单个字符(空间占位符) [] 规定有效范围,或某个"OR"条件 [ABG] A,B,G [A-C] A,B,C [A-CE-G] A,B,C,E,F,G [^ABG] 除了A,B,G [^A-C] 除了A,B,C escape子句 用某个转义字符可在搜索字符串时将通配符作为文字来包含。 ANSI-89 SQL标准定义了escape子句指定某个转义字符 缺省情况下,[]来转义某个通配符,例: select * from test_tab where description like "%20[%]%" 语法: like char_expression escape escape_character 例 select * from test_tab where description like "%20#%%" escape "#" + 可用于串接字符 select au_laname+","+au_fname from authors 数学函数 abs(numeric_expr) 返回指定值的绝对值 ceiling(numeric_expr) 返回大于或等于指定值的最小整数 exp(float_expr) 给出指定值的指数值 floor(numeric_expr) 返回小于或等于指定值的最大整数 pi() 返回常数3.1415926 power(numeric_expr,power) 返回numeric_expr的值给power的幂 rand([int_expr]) 返回0-1之间的随机浮点数,可指定基值 round(numeric_expr,int_expr) 把数值表达式圆整到int_expr指定的精度 sign(int_expr) 返回正+1,零0或负-1 sqrt(float_expr) 返回指定值的平方根 SQL SERVER支持所有标准的三角函数和其他有用的函数 日期函数 getdate() 返回当前的系统日期和时间 datename(datepart,date_expr) 以字符串形式返回date_expr指定部分的值,转换成合适的名字 datepart(datepart,date_expr) 作为整数返回date_expr值的指定部分 datediff(datepart,date_expr1,date_expr2) 返回date_expr2-date_expr1,通过指定的datepart度量 dateadd(datepart,number,date_expr) 返回日期,通过在date_expr上增加指定number的日期部件而产生的 datepart 日期部件 缩写 值范围 年 yy 1753-9999 季度 qq 1-4 月 mm 1-12 每年中的天 dy 1-366 天 dd 1-31 星期 wk 1-54 星期天 dw 1-7(1=sunday) 小时 hh 0-23 分钟 mi 0-59 秒 ss 0-59 毫秒 ms 0-999 例: select invoice_no, datediff(dd,date_shipped,getdate()) from invoices where balance_due>0 转换函数convert 此函数把值从一种类型改变成另一种类型 convert(datetype [(length)],expression) select "Advance="+convert(char(12),advance) from titles 日期转换 convert(datetype[(length)],expression,format) format指定将日期转换为什么格式,有以下值: 没有世纪 有世纪 转换字符串中日期格式 0 or 100 mon dd yyy hh:miAM(or PM) 1 101 mm/dd/yy 2 102 yy.mm.dd 3 103 dd/mm/yy 4 104 dd.mm.yy 5 105 dd-mm-yy 6 106 dd mon yy 7 107 mon dd,yy 8 108 hh:mm:ss 9 or 109 mon dd,yyyy hh:mi:ss:mmmAM(or PM) 10 110 mm-dd-yy 11 111 yy/mm/dd 12 112 yymmdd 系统函数 函数 定义 访问和安全性信息 host_id() 客户进程的当前主机进程ID号 host_name() 客户进程的当前主计算机名 suser_id(["login_name"]) 用户的SQL Server ID号 suser_name([server_user_id]) 用户的SQL Server登录名 user_id(["name_in_db"]) 用户在数据库中的ID号 user_name([user_id]) 用户在数据库中的名字 user 用户在数据库中的名字 show_role() 用户的当前活动角色
数据库和对象信息 db_id(["db_name"]) 数据库ID号 db_name([db_id]) 数据库名 object_id("objname") 数据库对象ID号 object_name(obj_id]) 数据库对象号 col_name(obj_id,col_id) 对象的栏名 col_length("objname","colname") 栏的长度 index_col("objname",index_id,key#) 已索引的栏名 valid_name(char_expr) 若char_expr不是有效标识符,则返回0
数据函数 datalength(expression) 按字节返回expression的长度 tsequal(timestamp1,timestamp2) 比较时戳值,若时戳值不匹配,则返回出错消息 isnull() isnull函数用指定的值代替查询栏或合计中的空值 例: select avg(isnull(total_order,$0)) from invoices
select datepart(yy,getdate()) --year
select datepart(mm,getdate()) --month
select datepart(dd,getdate()) --day
select datepart(hh,getdate()) --hour
select datepart(mi,getdate()) --min
select datepart(ss,getdate()) --sec
--取星期几
set datefirst 1
select datepart(weekday,getdate()) --weekday
--字符串时间
select getdate() -- '03/11/12'
select convert(char,getdate(),101) -- '09/27/2003'
select convert(char,getdate(),102) -- '2003.11.12'
select convert(char,getdate(),103) -- '27/09/2003'
select convert(char,getdate(),104) -- '27.09.2003'
select convert(char,getdate(),105) -- '27-09-2003'
select convert(char,getdate(),106) -- '27 Sep 2003'
select convert(char,getdate(),107) --'Sep 27, 2003'
select convert(char,getdate(),108) --'11:16:06'
select convert(char,getdate(),109) --'Sep 27 2003 11:16:28:746AM'
select convert(char,getdate(),110) --'09-27-2003'
select convert(char,getdate(),111) --'2003/09/27'
select convert(char,getdate(),112) --'20030927'
select rtrim(convert(char,getdate(),102))+' '+(convert(char,getdate(),108)) -- '2003.11.12 11:03:41'
--整数时间
select convert(int,convert(char(10),getdate(),112)) -- 20031112
select datepart(hh,getdate())*10000 + datepart(mi,getdate())*100 + datepart(ss,getdate()) -- 110646
--时间格式 "YYYY.MM.DD HH:MI:SS" 转换为 "YYYYMMDDHHMISS"
declare @a datetime,@tmp varchar(20),@tmp1 varchar(20)
select @a=convert(datetime,'2004.08.03 12:12:12')
select @tmp=convert(char(10),@a,112)
select @tmp
select @tmp1=convert(char(10),datepart(hh,@a)*10000 + datepart(mi,@a)*100 + datepart(ss,@a))
select @tmp1
select @tmp=@tmp+@tmp1
select @tmp
--当月最后一天
declare
@tmpstr varchar(10)
@mm int,
@premm int,
@curmmlastday varchar(10)
begin
select @mm=datepart(month,getdate())--当月
select @premm=datepart(month,dateadd(month,-1,getdate())) --上个月
if (@mm>=1 and @mm<=8)
select @tmpstr=convert(char(4),datepart(year,getdate()))+'.0'+convert(char(1),datepart(month,dateadd(month,1,getdate())))+'.'+'01'
else if (@mm>=9 and @mm<=11)
select @tmpstr=convert(char(4),datepart(year,getdate()))+'.'+convert(char(2),datepart(month,dateadd(month,1,getdate())))+'.'+'01'
else
select @tmpstr=convert(char(4),datepart(year,dateadd(year,1,getdate())))+'.0'+convert(char(1),datepart(month,dateadd(month,1,getdate())))+'.'+'01'
select @curmmlastday=convert(char(10),dateadd(day,-1,@tmpstr),102) --当月最后一天
end
源文档 <http://hi.baidu.com/hwaspf/blog/item/a0ef87be66326e0d18d81f17.html>
posted @
2012-08-21 10:49 xzc 阅读(3916) |
评论 (0) |
编辑
avaScript世界的一等公民 - 函数
摘要: 转自:http://software.intel.com/zh-cn/articles/javascript-first-class-citizen-function/?cid=sw:prccsdn229032简介在很多传统语言(C/C++/Java/C#等)中,函数都是作为一个二等公民存在,你只能用语言的关键字声明一个函数然后调用它,如果需要把函数作为参数传给另一个函数,或是赋值给一个本地变量,...
阅读全文
posted @
2012-07-24 13:45 xzc 阅读(3775) |
评论 (0) |
编辑
【昆明达内】Oralce与Sybase IQ差异比较及使用心得
因为之前使用的是Oralce所以在摸索使用用Sybase很长一段时间后,总结了一下Sybase IQ的使用 心得和大家分享,希望对大家会有帮助。 1、字母大小写比对不敏感,也就是在值比对判断时大小写字母都一样; 2、等值,或<>判断,系统默认对等式两边比对值去右边空格再进行比较; 3、GROUP BY 可以根据SELECT字段或表达式的别名来 汇总,在编写时也尽量避免SELECT 语句的别 名与FROM表中的字段有重复,不然会出现莫名其妙的错误; 4、FROM后的子查询 要定义别名才可使用; 5、存储过程要返回IQ系统错误信息 SQLCODE || ERRORMSG(*) :(两者都为EXCEPTION后第一条SQL 语句才有效果); 6、IQ中若采用 FULL JOIN 连接则不能使用 WHERE 条件,否则FULL JOIN将失效,要筛选条件则用 子查询先过滤记录后再FULL JOIN; 7、建表时,字段默认为非空; 8、UPDATE语句,如果与目标表关联的表有多条,则不会报错,而是随机取一条更新(第一条); 9、RANK() OVER(PARTITION BY .. ORDER BY ..) 分组分析函数,相同的ORDER BY值,返回顺序值 一样,且PARTITION BY 只支持一个字段或一个字段组(需多个字段分组的则要用 || 拼为一个字 段(待确认,该问题以前碰过一次,再次验证却不存在这问题)) 10、返回可读的 全局唯一字符:UUIDTOSTR(NEWID()) 11、存储过程隐式游标语法: FOR A AS B CURSOR FOR SELECT ... FROM ... DO .... 过程语句 END FOR; 需要注意的时,这边的A 和 B 在 过程语句中都不能引用,所以为避免过程语句其他字段名与FOR SELECT 语句的字段名称重复,FOR SELECT 语句的字段最好都定义别名区分 12、根据SELECT 语句建立[临时]表的方法(ORACLE的CREATE TABLE)为 SELECT ..[*] INTO [#] table_name FROM ..; 其中如果在table_name加前缀#,则为会话级临时表,否则为实体表; 13、因Sybase为列存储模式,在执行上INSERT语句会比UPDATE语句慢,尤其表数据越多INSERT效率 就越慢;所以在ETL时建议多用UPDATE而不是INSERT 14、虽说Sybase为列存储模式,每个字段上都有默认索引,但对于经常的两表的关联键还是要建立 索引否则会经常报QUERY_TEMP_SPACE_LIMIT不足的错误; 15、存储过程中也可以显示的执行DDL语句,这点与Oracle不同; 16、空字符串''在Sybase中也是个字符而不是null值,这点要注意; 17、调整SESSION的临时空间SET TEMPORARY OPTION QUERY_TEMP_SPACE_LIMIT = '150000'; 15000 为大小,如写0则没限制大小 ==================================常用函数=========================================== 字符串函数 1)ISNULL(EXP1,EXP2,EXP3,...) :返回第一个非空值,用法与COALESCE(exp1,exp2[,exp3...])相 同 3)TRIM(exp) :去除两边空格 4)DATEFORMAT(date_exp,date_format) :日期型转字符型; 5)STRING(exp):转为字符型; 6)SUBSTRING(exp,int-exp1,[int-exp2]):截取exp从int-exp1开始,截取int-exp2个字符; 7)REPLACE(o-exp,search-exp,replace-exp):从o-exp搜索search-exp,替换为replace-exp; 8)SPACE(int_exp):返回int个空格; 8)UPPER(exp):转为大写字母,等价于UCASE(exp); 8)LOWER(exp):转为小写字母, 8)CHARINDEX(exp1,exp2):返回exp2字符串中exp1的位置!定位,exp1 查找的字符,exp2 被查找 的字符串; 8)DATALENGTH(CHAR_EXPR):在char_expr中返回字符的长度值,忽略尾空; 8)RIGHT(char_expr,int_expr):返回char_expr右边的int_expr个字符; 8)LEFT(char_expr,int_expr):返回char_expr左边的int_expr个字符; 8)REPLICATE(char_expr,int_expr):重复char_expr,int_expr次; 8)STUFF(expr1,start,length,expr2):用expr2代替epxr1中start起始长为length的字符串; 8)REVERSE(char_expr):反写char_expr中的文本; 8)LTRIM(char_expr):删除头空; 8)RTRIM(char_expr):删除尾空; 8)STR(float_expr[,length[,decimal]]):进行数值型到字符型转换; 8)PATINDEX("%pattern%",expression):返回指定样式的开始位置,否则为0; 8)NULLIF(exp1,exp1):比较两个表达式,如果相等则返回null值,否则返回exp1 8)NUMBER(*):返回序号,相当于ORACLE的rowid,但有区别; 其他函数 8)RANK() OVER(PARTITION BY .. ORDER BY ..) 分组分析函数,相同的ORDER BY值,返回顺序值 一样,且PARTITION BY 只支持一个字段或一个字段组(需多个字段分组的则要用 || 拼为一个字 段(待确认)) 8)返回可读的 全局ID UUIDTOSTR(NEWID()) 8)COL_LENGTH(tab_name,col_name):返回定义的列长度;兼容性:IQ&ASE 8)LENGTH(exp):返回exp的长度;兼容性:IQ 转换函数 8)CONVERT(datetype,exp[,format-style]):字符转日期型 或DATE(exp);兼容性:IQ&ASE format-style值 输出: 112 yyyymmdd 120 yyyy-mm-dd hh:nn:ss SELECT CONVERT(date,'20101231',112),CONVERT(varchar(10),getdate(),120) ; --结果 2010-12-31 2011-04-07 8)CAST(exp AS data-type):返回转换为提供的数据类型的表达式的值; 兼容性:IQ 日期函数 8)DAY(date_exp):返回日期天值,DAYS(date_exp,int):返回日期date_exp加int后的日期;MONTH 与MONTHS、YEAR与YEARS同理; 8)DATE(exp):将表达式转换为日期,并删除任何小时、分钟或秒;兼容性:IQ 8)DATEPART(date-part,date-exp): 返回日期分量的对应值(整数); 8)GETDATE():返回系统时间; 8)DATENAME(datepart,date_expr):以字符串形式返回date_expr指定部分的值,转换成合适的名字 ; 8)DATEDIFF(datepart,date_expr1,date_expr2):返回date_expr2-date_expr1,通过指定的 datepart度量; 8)DATEADD(date-part,num-exp,date-exp):返回按指定date-part分量加num-exp值后生成的 date-exp值;兼容性:IQ&ASE date-part日期分量代表值: 缩写 值 YY 0001-9999 QQ 1-4 MM 1-12 WK 1-54 DD 1-31 DY 1--366 DW 1-7(周日-周六) HH 0-23 MI 0-59 SS 0-59 MS 0-999 数值函数 8)CEIL(num-exp):返回大于或等于指定表达式的最小整数;兼容性:IQ&ASE; 8)FLOOR(numeric_expr):返回小于或等于指定值的最大整数; 8)ABS(num-exp):返回数值表达式的绝对值;兼容性:IQ&ASE; 8)TRUNCNUM(1231.1251,2):截取数值;不四舍五入; 8)ROUND(numeric_expr,int_expr):把数值表达式圆整到int_expr指定的精度; 8)RAND([int_expr]):返回0-1之间的随机浮点数,可指定基值; 8)SIGN(int_expr):返回正+1,零0或负-1; 8)SQRT(float_expr):返回指定值的平方根; 8)PI():返回常数3.1415926; 8)POWER(numeric_expr,power):返回numeric_expr的值给power的幂; 8)EXP(float_expr):给出指定值的指数值; ==================================常用DDL语句 =========================================== Sybase中DDL语句不能修改字段的数据类型,只能修改空与非空: 1.删除列: ALTER TABLE table_name DELETE column_name; 2.增加列: ALTER TABLE table_name ADD (column_name DATA_TYPE [NOT] NULL); 3.修改列的空与非空: ALTER TABLE table_name MODIFY column_name [NOT] NULL; 4.修改列名: ALTER TABLE table_name RENAME old_column_name TO new_column_name; 5.快速建立临时表: SELECT * INTO [#]table_name FROM .....; 6、修改表名: ALTER TABLE old_table_name RENAME new_table_name 7.增加主键约束: ALTER TABLE tb_name ADD CONSTRAINT pk_name PRIMARY KEY(col_name,..) 8.删除主键约束: ALTER TABLE tb_name DROP CONSTRAINT pk_name; 9.建立自增长字段,与Oracle的SEQUENCE类似: CREATE TABLE TMP_001 (RES_ID INTEGER IDENTITY NOT NULL); 10.添加表注释: COMMENT ON TABLE table_name IS '....'; 11.创建索引: CREATE INDEX index_name ON table_name(column_name);
posted @
2012-06-18 10:57 xzc 阅读(4379) |
评论 (0) |
编辑
Oracle to_char格式化函数
摘要: Postgres 格式化函数提供一套有效的工具用于把各种数据类型(日期/时间,int,float,numeric)转换成格式化的字符串以及反过来从格式化的字符串转换成原始的数据类型。注意:所有格式化函数的第二个参数是用于转换的模板。表 5-7. 格式化函数 函数返回描述例子to_char(timestamp, text)text把 timestamp 转换成 str...
该贴由system转至本版2014-9-9 23:17:44