1. copy命令
对于数据加载,GreenPlum数据库提供copy工具,copy工具源于PostgreSQL数据库,copy命令支持文件与表之间的数据加载和表对文件的数据卸载。使用copy命令进行数据加载,数据需要经过Master节点分发到Segment节点,同样使用copy命令进行数据卸载,数据也需要由Segment发送到Master节点,由Master节点汇总后再写入外部文件,这样就限制了数据加载与卸载的效率,但是数据量较小的情况下,copy命令就非常方便。下面测试通过copy命令实现操作系统文件到数据库中表的数据加载。
1.1 创建测试表
lottu=# create table tbl_pay_log_copy (id int primary key,order_num varchar(100),accountid varchar(30),qn varchar(20),appid int,amount numeric(10,2),pay_time timestamp);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tbl_pay_log_copy_pkey" for table "tbl_pay_log_copy"
CREATE TABLE
lottu=# \d tbl_pay_log_copy
Table "public.tbl_pay_log_copy"
Column | Type | Modifiers
-----------+-----------------------------+-----------
id | integer | not null
order_num | character varying(100) |
accountid | character varying(30) |
qn | character varying(20) |
appid | integer |
amount | numeric(10,2) |
pay_time | timestamp without time zone |
Indexes:
"tbl_pay_log_copy_pkey" PRIMARY KEY, btree (id), tablespace "tbs_lottu"
Distributed by: (id)
Tablespace: "tbs_lottu"
1.2 准备测试数据
[gpadmin@mdw ~]$ head ios_pay.txt
73,ysios_receipt_3793615cb10dc393bba87c82d3c6544f,27388062,yriu1244_16043_001,2616,98.00,2017-11-06 17:36:43
72,ysios_receipt_32946f3d37e774781babe103352bd230,27424976,yriu1244_16043_001,2616,30.00,2017-11-06 15:18:56
75,ysios_receipt_3e2e432550253450412692392c7675d0,27388294,yriu1244_16043_001,2616,98.00,2017-10-19 07:33:03
74,ysios_receipt_3793615cb10dc393bba87c82d3c6544f,27388062,yriu1244_16043_001,2616,98.00,2017-11-06 20:40:46
77,ysios_receipt_ee6bed338a32f836a999133cd2e6d547,27388294,yriu1244_16043_001,2616,98.00,2017-10-19 22:27:46
76,ysios_receipt_ae53b142924c0604820537d61a9dd73e,27424976,yriu1244_16043_001,2616,648.00,2017-10-19 12:10:17
79,ysios_receipt_30ec130bcdf0e864629d12f8392d4b43,27385229,yriu1244_16043_001,2616,98.00,2017-10-21 07:46:01
78,ysios_receipt_e2b62024f1b0c3a2c3aae1e80f126eb6,27387306,yriu1244_16043_001,2616,25.00,2017-10-20 01:54:24
81,ysios_receipt_3e72a8e32c9fee546ab08d103606e6cb,27424976,yriu1244_16043_001,2616,30.00,2017-10-21 13:55:54
80,ysios_receipt_6ca291884fcfe3d1583b49a3611b4ccc,27424976,yriu1244_16043_001,2616,25.00,2017-10-21 13:55:51
[gpadmin@mdw ~]$ wc -l ios_pay.txt
20027 ios_pay.txt
[gpadmin@mdw ~]$ du -sh ios_pay.txt
1.9M ios_pay.txt
现在文本“ios_pay.txt”有20027行记录;大小约2M。
1.3 copy命令语法
lottu=# \h copy
Command: COPY
Description: copy data between a file and a table
Syntax:
COPY table [(column [, ...])] FROM {'file' | STDIN}
[ [WITH]
[OIDS]
[HEADER]
[DELIMITER [ AS ] 'delimiter']
[NULL [ AS ] 'null string']
[ESCAPE [ AS ] 'escape' | 'OFF']
[NEWLINE [ AS ] 'LF' | 'CR' | 'CRLF']
[CSV [QUOTE [ AS ] 'quote']
[FORCE NOT NULL column [, ...]]
[FILL MISSING FIELDS]
[ [LOG ERRORS INTO error_table] [KEEP]
SEGMENT REJECT LIMIT count [ROWS | PERCENT] ]
COPY {table [(column [, ...])] | (query)} TO {'file' | STDOUT}
[ [WITH]
[OIDS]
[HEADER]
[DELIMITER [ AS ] 'delimiter']
[NULL [ AS ] 'null string']
[ESCAPE [ AS ] 'escape' | 'OFF']
[CSV [QUOTE [ AS ] 'quote']
[FORCE QUOTE column [, ...]] ]
常用参数 分隔符:[DELIMITER [ AS ] 'delimiter'] 处理空列(含有空格符的是不行的):[NULL [ AS ] 'null string'] 记录错误数据,错误日志表自动创建: [LOG ERRORS INTO error_table] [KEEP] 允许错误的行数或者百分比,大于指定值导入失败全部回滚:SEGMENT REJECT LIMIT count [ROWS | PERCENT] ]
1.4 数据加载
执行必须拥有superuser权限的用户
lottu=# \du lottu
List of roles
Role name | Attributes | Member of
-----------+----------------------+-----------
lottu | Superuser, Create DB |
执行命令;使用默认参数如下:
命令:copy tbl_pay_log_copy from '/home/gpadmin/ios_pay.txt' with delimiter ',' null '' ;
lottu=# copy tbl_pay_log_copy from '/home/gpadmin/ios_pay.txt' with delimiter ',' null '' ;
ERROR: invalid input syntax for type numeric: "w" (seg0 sdw1:40000 pid=3183)
CONTEXT: COPY tbl_pay_log_copy, line 32, column 3
出现错误行记录;先不讨论如何跳过错误行记录;执行copy命令失败;是否有必要对表进行VACUUM?可以验证下
lottu=# select ctid,id from tbl_pay_log_copy ;
ctid | id
------+----
(0 rows)
lottu=# insert into tbl_pay_log_copy (id) values (1);
INSERT 0 1
lottu=# select ctid,id from tbl_pay_log_copy ;
ctid | id
--------+----
(0,17) | 1
(1 row)
执行失败;数据是回滚了;但是插入记录并不是从(0,0)开始的;所以执行有必要对表进行VACUUM
如何跳过错误行;加入下面参数即可
LOG ERRORS INTO参数指定错误数据记录到哪张表中 SEGMENT REJECT LIMIT参数指定最大跳过的错误数
命令:copy tbl_pay_log_copy from '/home/gpadmin/ios_pay.txt' with delimiter ',' null '' LOG ERRORS INTO tbl_pay_log_copy_errs SEGMENT REJECT LIMIT 100;
lottu=# copy tbl_pay_log_copy from '/home/gpadmin/ios_pay.txt' with delimiter ',' null '' LOG ERRORS INTO tbl_pay_log_copy_errs SEGMENT REJECT LIMIT 100;
NOTICE: Error table "tbl_pay_log_copy_errs" does not exist. Auto generating an error table with the same name
WARNING: The error table was created in the same transaction as this operation. It will get dropped if transaction rolls back even if bad rows are present
HINT: To avoid this create the error table ahead of time using: CREATE TABLE (cmdtime timestamp with time zone, relname text, filename text, linenum integer, bytenum integer, errmsg text, rawdata text, rawbytes bytea)
NOTICE: Found 1 data formatting errors (1 or more input rows). Errors logged into error table "tbl_pay_log_copy_errs"
COPY 20026
表tbl_pay_log_copy成功插入20026行记录;1条失败记录插入表tbl_pay_log_copy_errs;该表不需要创建;若库不存在表;则会创建
下面看下这20026条数据的数据分布情况。是否倾斜?
lottu=# select gp_segment_id,count(*) from tbl_pay_log_copy group by 1;
gp_segment_id | count
---------------+-------
0 | 10013
1 | 10013
1.5 数据卸载
Copy工具不仅可以把数据从文件加载到数据库的表中,也可以将数据从数据库的表中卸载到操作系统的文件中。如下:
命令:copy tbl_pay_log_copy to '/home/gpadmin/tbl_pay_log_copy_output.txt' WITH DELIMITER AS ',';
lottu=# copy tbl_pay_log_copy to '/home/gpadmin/tbl_pay_log_copy_output.txt' WITH DELIMITER AS ',';
COPY 20026
也可以根据query进行卸载;这样可以根据需求导出自己需要的记录或者列记录。如下:
命令:copy (select * from tbl_pay_log_copy where id = 73) to '/home/gpadmin/tbl_pay_log_copy_id_73.txt' WITH DELIMITER AS ',';
lottu=# copy (select * from tbl_pay_log_copy where id = 73) to '/home/gpadmin/tbl_pay_log_copy_id_73.txt' WITH DELIMITER AS ',';
COPY 1
查看导出文件
[gpadmin@mdw ~]$ ll tbl_pay_log_copy_output.txt tbl_pay_log_copy_id_73.txt
-rw-r--r--. 1 gpadmin gpadmin 109 Apr 18 22:52 tbl_pay_log_copy_id_73.txt
-rw-r--r--. 1 gpadmin gpadmin 1917463 Apr 18 22:50 tbl_pay_log_copy_output.txt
使用SELECT的COPY效率比直接使用表名COPY效率低很多,对于数据量稍大的表,可以考虑使用中间表结合COPY的方式来卸载数据
1.6 其他参数解释
format:指定导入的文件格式为csv格式 escape:指定了在引号中的转义字符为反斜杠,这样即使在引号字串中存在引号本身,也可以用该字符进行转义,变为一般的引号字符,而不是字段终结 header true:指定文件中存在表头。如果没有的话,则设置为false quote:指定了以双引号作为字符串字段的引号,这样它会将双引号内的内容作为一个字段值来进行处理
2. 使用gpfdist的外部表
外部表提供了对Greenplum数据库之外的来源中数据的访问。可以用SELECT语句访问它们,外部表通常被用于抽取、装载、转换(ELT)模式,这是一种抽取、转换、装载(ETL)模式的变种,这种模式可以利用Greenplum数据库的快速并行数据装载能力。这是COPY命令不持有的。
外部表加载方式有很多;详细介绍《请见Greenplum数据库参考指南》
gpfdist原理:
gpfdist是一个使用HTTP协议的文件服务器程序,它以并行的方式向Greenplum数据库的Segment供应外部数据文件一个gpfdist实例,每秒能供应200MB并且很多gpfdist进程可以同时运行,每一个供应要被装载的数据的一部分。当使用者用INSERT INTO
SELECT * FROM 这样的语句开始装载时,INSERT语句会被Master解析并且分布给主Segment。Segment连接到gpfdist服务器并且并行检索数据,解析并验证数据,从分布键数据计算一个哈希值并且基于哈希键把行发送给它的目标Segment。每个gpfdist实例默认将接受最多64个来自Segment的连接。通过让许多Segment和gpfdist服务器参与到装载处理中,可以以非常高的速率被装载。
2.1 创建实验环境
lottu=# create table tbl_pay_log_gpfdist(id int primary key,order_num varchar(100),accountid varchar(30),qn varchar(20),appid int,amount numeric(10,2),pay_time timestamp);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "tbl_pay_log_gpfdist_pkey" for table "tbl_pay_log_gpfdist"
CREATE TABLE
lottu=# \d tbl_pay_log_gpfdist
Table "public.tbl_pay_log_gpfdist"
Column | Type | Modifiers
-----------+-----------------------------+-----------
id | integer | not null
order_num | character varying(100) |
accountid | character varying(30) |
qn | character varying(20) |
appid | integer |
amount | numeric(10,2) |
pay_time | timestamp without time zone |
Indexes:
"tbl_pay_log_gpfdist_pkey" PRIMARY KEY, btree (id), tablespace "tbs_lottu"
Distributed by: (id)
Tablespace: "tbs_lottu"
[gpadmin@mdw ~]$ head ios_pay.txt
73,ysios_receipt_3793615cb10dc393bba87c82d3c6544f,27388062,yriu1244_16043_001,2616,98.00,2017-11-06 17:36:43
72,ysios_receipt_32946f3d37e774781babe103352bd230,27424976,yriu1244_16043_001,2616,30.00,2017-11-06 15:18:56
75,ysios_receipt_3e2e432550253450412692392c7675d0,27388294,yriu1244_16043_001,2616,98.00,2017-10-19 07:33:03
74,ysios_receipt_3793615cb10dc393bba87c82d3c6544f,27388062,yriu1244_16043_001,2616,98.00,2017-11-06 20:40:46
77,ysios_receipt_ee6bed338a32f836a999133cd2e6d547,27388294,yriu1244_16043_001,2616,98.00,2017-10-19 22:27:46
76,ysios_receipt_ae53b142924c0604820537d61a9dd73e,27424976,yriu1244_16043_001,2616,648.00,2017-10-19 12:10:17
79,ysios_receipt_30ec130bcdf0e864629d12f8392d4b43,27385229,yriu1244_16043_001,2616,98.00,2017-10-21 07:46:01
78,ysios_receipt_e2b62024f1b0c3a2c3aae1e80f126eb6,27387306,yriu1244_16043_001,2616,25.00,2017-10-20 01:54:24
81,ysios_receipt_3e72a8e32c9fee546ab08d103606e6cb,27424976,yriu1244_16043_001,2616,30.00,2017-10-21 13:55:54
80,ysios_receipt_6ca291884fcfe3d1583b49a3611b4ccc,27424976,yriu1244_16043_001,2616,25.00,2017-10-21 13:55:51
[gpadmin@mdw ~]$ wc -l ios_pay.txt
20027 ios_pay.txt
[gpadmin@mdw ~]$ du -sh ios_pay.txt
1.9M ios_pay.txt
现在文本“ios_pay.txt”有20027行记录;大小约2M。
2.2 gpfdist加载数据
在看下gpfdist工具,gpfdist工具可以实验并行加载,需要先启动gpfdist进程及监听端口,这个命令在Master和Segment节点的GPHOME/bin目录下,如果配置了GP的环境变量,可以直接使用,如果在没有安装GP的服务器上使用gpfdist工具,只需要将gpfdist命令的文件拷贝到相应的服务器上即可使用。
本实验文件在Master节点上;只需在Master启动。
命令: nohup gpfdist -d /home/gpadmin -p 1234 -l /home/gpadmin/gpfdist.log &
[gpadmin@mdw ~]$ nohup gpfdist -d /home/gpadmin -p 1234 -l /home/gpadmin/gpfdist.log &
[1] 28777
如上命令,启动gpfdist进程,扫描路径为/home/gpadmin,监听端口为1234,下面创建一张基于gpfdist工具的外部表。
create external table med_pay_log_gpfdist
(id int,order_num varchar(100),accountid varchar(30),qn varchar(20),appid int,amount numeric(10,2),pay_time timestamp)
location('gpfdist://mdw:1234/ios_pay.txt')
format 'TEXT' (DELIMITER as ',' null as ''ESCAPE as 'OFF')
encoding 'utf8' LOG ERRORS INTO med_pay_log_gpfdist_err SEGMENT REJECT LIMIT 100;
查看gpfdist进程
ps -ef|grep gpfdist|grep -v "grep"
停掉gpfdist进程
kill xxx
pg_cancel_backend(xxx)
加载数据
lottu=# insert into tbl_pay_log_gpfdist select * from med_pay_log_gpfdist;
NOTICE: Found 1 data formatting errors (1 or more input rows). Rejected related input data.
INSERT 0 20026
Time: 780.017 ms
ANALYZE表
lottu=# analyze tbl_pay_log_gpfdist;
ANALYZE
加载完成之后需要停到gpfdist进程
[gpadmin@mdw ~]$ ps -ef|grep gpfdist|grep -v "grep"
gpadmin 28777 20448 0 00:32 pts/1 00:00:00 gpfdist -d /home/gpadmin -p 1234 -l /home/gpadmin/gpfdist.log
[gpadmin@mdw ~]$ kill 28777
删除外部表
lottu=# drop external table med_pay_log_gpfdist;
DROP EXTERNAL TABLE
GP数据库查询数据,先扫描到的数据会直接返回,也就是多次查询的结果可能是不一样的,使用gpfdist工具加载,而gpfdist工具加载数据是并行加载的,最先插入到数据库的数据并不一定是从第一条数据开始的。
查看数据是否倾斜
lottu=# select gp_segment_id,count(*) from tbl_pay_log_gpfdist group by 1;
gp_segment_id | count
---------------+-------
1 | 10013
0 | 10013
2.3 卸载数据
使用可写外部表卸载数据时,如果使用gpfdist工具,就可以实现并行卸载,而且数据不需要经过Master节点,直接由Segment节点写入到外部文件中,效率比较高,卸载大量数据时,使用这种方式会节省大量的时间。
下面测试通过可写外部表并且使用gpfdist工具来卸载数据到sdw1主机上
在sdw1主机启动gpfdist进程
nohup gpfdist -d /home/gpadmin -p 1234 -l /home/gpadmin/gpfdist.log &
创建可写外部表
lottu=# create writable external table med_pay_log_gpfdist_unload (like tbl_pay_log_gpfdist) location ('gpfdist://192.168.1.202:1234/unload.txt') Format 'text';
NOTICE: Table doesn't have 'distributed by' clause, defaulting to distribution columns from LIKE table
CREATE EXTERNAL TABLE
Time: 46.912 ms
卸载数据
lottu=# insert into med_pay_log_gpfdist_unload select * from tbl_pay_log_gpfdist;
INSERT 0 20026
卸载完成之后需要停到gpfdist进程
[gpadmin@sdw1 ~]$ ps -ef|grep gpfdist|grep -v "grep"
gpadmin 4650 1163 0 00:57 pts/0 00:00:00 gpfdist -d /home/gpadmin -p 1234 -l /home/gpadmin/gpfdist.log
[gpadmin@sdw1 ~]$ kill 4650
删除外部表
lottu=# drop external table med_pay_log_gpfdist_unload;
DROP EXTERNAL TABLE
3. GreenPlum数据加载工具gpload
gpload是一种数据装载工具,它扮演着Greenplum外部表并行装载特性的接口的角色。gpload使用定义在一个YAML格式的控制文件中的规范来执行一次装载。
它会执行下列操作:
调用gpfdist进程
基于定义的源数据创建一个临时的外部表定义
执行INSERT、UPDATE或者MERGE操作将源数据载入数据库中的目标表
删除临时外部表
清除gpfdist进程
3.1 创建实验环境
create table tbl_pay_log_gpload (like tbl_pay_log_gpfdist);
3.2 创建YAML格式控制文件
使用gpload工具,需要编写gpload工具的控制文件,这个控制文件是使用yuml语言编写,如下是gpload工具的演示
---
VERSION: 1.0.0.1
DATABASE: lottu
USER: lottu
HOST: mdw
PORT: 5432
GPLOAD:
INPUT:
- SOURCE:
LOCAL_HOSTNAME:
- sdw1
PORT: 1234
FILE:
- /home/gpadmin/unload.txt
- COLUMNS:
- id: int
- order_num: varchar
- accountid: varchar
- qn: varchar
- appid: int
- amount: numeric
- pay_time: timestamp
- FORMAT: text
- ERROR_LIMIT: 25
- error_table: public.tbl_pay_log_gpload_err
OUTPUT:
- TABLE: public.tbl_pay_log_gpload
- MODE: INSERT
SQL:
- BEFORE: "truncate table public.tbl_pay_log_gpload"
- AFTER: "ANALYZE tbl_pay_log_gpload"
特别提醒:“-”后一定要有空格;“:”后也一定要有空格。
参数说明:
VERSION 自定义版本号(可选项)
DATABASE 需要连接的数据库,如果没有指定,根据$PGDATABASE变量确定
USER 执行操作的用户。如果没指定,根据$PGUSER变量确定
HOST 可选项。指定master节点的主机名(IP)。如果没指定,根据变量$PGHOST确定。
PORT 可选项。指定master的端口,默认是5432或者$GPORT。
GPLOAD 必须项。load部分的开始。一个GPLOAD部分必须包含一个INPUT和一个OUTPUT。
INPUT 必须项。定义加载数据的格式和位置。gpload在当前主机上启动一个或者多个gpfdist文件分布式实例 。注意,gpload命令所在主机可网络访问Greenplum中的每个节点(master&segment)。
SOURCE 必须项。INPUT部分的SOURCE块其定义了source文件所在位置。一个INPUT部分中可以有1个或者多个SOURCE块定义。每个SOURCE块定义对应了一个本机的gpfdist实例。每个SOURCE块定义必须制定一个source文件。
LOCAL_HOSTNAME 可选项。gpload工具运行所在的主机名或者IP地址。如果这台主机有多个网卡,能同时使用每个网卡(每个网卡都有一个IP地址),通过设定LOCAL_HOSTNAME和PORT 实现多个gpfdist实例,可提升数据加载速度。默认情况,只使用主主机名或者IP地址。
PORT 可选项。gpfdist实例需要的端口。
FILE 必须项。文件位置。可同时制定多个相同格式的文件,入/home/gpadmin/script/*.txt。如果是gzip或bzip2文件,会自动解压(在环境变量中设定好gunzip、bunzip2的路径)。
CLOUMNS 可选项。说明source文件的格式,列名:数据类型。DELIMITER参数,指明source文件中两个数据之间的分隔符。如果没有指定COLUMNS选项,意味着source文件中的列的顺序、列的数量、数据类型都和目标表一致。COLUMN的作用:SOURCE_TO_TARGET的mapping关系。
FORMAT 可选项。source文件的类型,比如text、csv。默认text格式不说指定。
DELIMITER 可选项。一行数据中,各列的分隔符号。TEXT格式中默认tab作为分隔符;CSV中以都好","作为分隔符。
ERROR_LIMIT 可选项。允许的错误行数。加载数据时,错误数据将被忽略。如果没有到达错误限制数量,所有正常行会加载到GP中,问题行会存放到err_table中。如果超过错误值,正常数据也不会加载。
ERROR_TABLE 可选项。前提是开启了ERROR_LIMIT 。错误表将记录错误行。如果错误表不存在,会自动创建。若存在,直接插入数据。
EXTERNAL 可选项。定义外部表。
OUTPUT 必须项。定义最终source文件加载到的目标表。
TABLE 必须项。目标表。
MODE 可选项。有三种模式:insert,插入数据; update,当MATCH_COLUMNS参数值(相当于关联列)等于加载数据时,更新UPDATE_COLUMS参数设置的列(相当于update的列)。 并且,必须设置UPDATE_CONDITION参数(相当于where过滤条件)。merge, 加载数据时,插入目标表中不存在的数据,更新目标中存在的数据。
MATCH_COLUMNS 在UPDATE或者MERGE模式下使用。相当于关联列。这里写目标表的列名。
UPDATE_COLUMNS 在UPDATE或者MERGE模式下使用。更新的目标表列名。
UPDATE_CONDITION 可选项。目标表的列名,相当于where条件。用在update或者merge模式。
MAPPING 可选项。如果设置了MAPPING参数,那么前面设置的COLUMNS参数会失效,因为MAPPING级别高于COLUMNS。关联格式:target_column_name: source_column_name。where过滤格式:target_column_name: 'expression'
RELOAD 可选项。导入时,是truncate之前目标表的数据,还是保留目标表数据。两种模式,TRUNCATE 和REUSE_TABLES。
SQL 可选项。定义开始运行gpload和gpload结束执行的SQL语句。BEFORE,开始运行gpload执行的SQL,SQL需引号括起来;AFTER,gpload结束后执行的SQL,SQL需引号括起来。
3.3 加载数据
然后使用gpload工具,将数据加载到数据库。
[gpadmin@sdw1 ~]$ gpload -f gpload.yml
2018-04-19 18:28:37|INFO|gpload session started 2018-04-19 18:28:37
Password:
2018-04-19 18:28:40|INFO|started gpfdist -p 1234 -P 1235 -f "/home/gpadmin/unload.txt" -t 30
2018-04-19 18:28:42|INFO|running time: 5.38 seconds
2018-04-19 18:28:43|INFO|rows Inserted = 22052
2018-04-19 18:28:43|INFO|rows Updated = 0
2018-04-19 18:28:43|INFO|data formatting errors = 0
2018-04-19 18:28:43|INFO|gpload succeeded
4. 数据装载性能技巧
在装载前删除索引 – 若装载一张新创建的表,最快的方式是先创建表,再装载数据,然后再创建任何需要的索引。在已存在的数据上创建索引比不断的递增索引要快。若向一个已有的表添加大量数据,更快的方式可能是,先删除索引,然后装载数据,然后再重新创建索引。临时的增加maintenance_work_mem服务器参数可以提升CREATE INDEX名的速度,不过,这可能对于装载数据本身没有性能提升。应该考虑在没有系统用户在用时进行删除并重新建立索引操作。
在装载之后运行ANALYZE -- 在修改了表中的大部分数据之后,强烈建议执行ANALYZE操作。执行ANALYZE(或者VACUUM ANALYZE)以确保查询规划器拥有最新的统计信息。如果没有统计信息或者统计信息过时了,规划器可能会根据过期的统计信息或不存在的统计信息选择一个较差的查询计划,以至导致较差的性能。
在装载出错后执行VACUUM – 如果运行的不是单条记录错误隔离模式,装载操作将在首次发生错误时终止。而目标表已经收到了错误发生前的记录。这些记录是无法被访问的,但它们仍占据磁盘空间。若这种情况发生在大的装载操作上,会导致大量的磁盘空间浪费。执行VACUUM命令可以回收这些浪费的空间。
在装载期间通过将gp_autostats_mode配置参数设置为NONE禁用自动统计信息收集。set gp_autostats_mode = none;
使用gpfdist和gpload装载数据的详细指导请见《Greenplum数据库参考指南》。
转自 https://www.cnblogs.com/lottu/p/8884778.html
你可能感兴趣的:(greenplum)
greenplum资源队列
李春田
文章来源https://www.cnblogs.com/pl-boke/p/9852439.html官方文档:https://gpdb.docs.pivotal.io/6-8/admin_guide/workload_mgmt.html1、创建资源队列语法Command:CREATERESOURCEQUEUEDescription:createanewresourcequeueforworkloa
makefile工程c语言工程在eclipse下如何配置头文件路径
乔丹搞IT
makefile工程c语言工程在eclipse下如何配置头文件路径如果是普通的c工程,没有使用makefile管理,则参考网络上的文章。这里我使用的是eclipsecppIDE导入一个greenplum5.0.0的源码,在查看gpperfmon源码时,发现在ide中无法直接查看apr相关的头文件内容,发现apr相关的头文件在目录/usr/include/apr-1目录中。修改方法:1,修改源码,把
Greenplum数据库用正则表达式进行高效数据匹配与处理
中台小A
greenplum 数据库 正则表达式
利用正则表达式,可以在Greenplum数据库中进行高效的数据匹配和处理。通过正则表达式函数和运算符,可以实现数据的模式匹配、数据提取、数据清洗等操作。这些功能为数据分析、数据清洗和数据转换提供了强大的工具。正则表达式简介正则表达式是一种描述文本模式的字符串。它由各种字符和操作符组成,用于匹配、查找和替换文本中的特定模式。在Greenplum数据库中,可以使用正则表达式进行模式匹配、数据提取、数据
MYSQL的读写扩展
hailang86
mysql 数据库
1.分布式数据库有很多种:采用分库分表方式将数据路由拆分到多个数据库上;以greenplum未代表的mpp数据库架构;以tidb为代表的newSQl数据库架构。2.mpp数据架构是一种处理大规模数据分析任务的分布式数据架构,大规模并行处理。当执行一条SQL语句时,会将语句发送到所有数据节点进行查询处理,利用多节点的计算能力进行计算。3.分库分表主要用于简单的业务场景,OLTP场景,onlinetr
ThreadLocal浅析
早点起床晒太阳
1、背景在使用我们的ToolBox(我们公司的数据分析平台)在往greenplum使用goload入数据的时候出现了数据错乱的问题,后来定位问题发现SimpledateFormat在多线程下是线程不安全的,刚开始我用匿名对象去解决这个问题,后来发现还是用ThreadLocal去解决才能提高效率,而且能保证安全2、ThreadLocal作用ThreadLocal提供了线程的局部变量,每个线程都可以通
GreenPlum安装文档
瞬即逝转
点点滴滴,简单记录。第一次写,不足之处请多包涵文档说明:1.greenplum-db5.10.2版本安装,网上有很多安装方法,本篇文档也是站在各位大牛肩膀上自己稍微整理了一下2.文档不太美观,从word复制到简述编辑器上,格式无法完美移植。特此说明:加粗处为执行命令,斜体为配置内容1安装说明名称版本操作系统CentOS6.564bitgreenplumgreenplum-db-appliance-
人麻了,刚面试入职就遇到MySQL亿级大表调优...
IT邦德
Mysql 面试 mysql 职场和发展
哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验一位上进心十足的【大数据领域博主】!中国DBA联盟(ACDU)成员,目前服务于工业互联网擅长主流Oracle、MySQL、PG、高斯及Greenplum运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。✨如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】❤️❤️❤️感谢各位大可爱小可爱!❤️❤️
从 Greenplum 到 Databend,万全网络数据库平台架构演进
Databend
网络 数据库 架构
作者:代城万全网络高级工程师,负责万全网络数据平台整体架构研发工作,拥有超过7年的大数据相关技术研发经验,一直关注着开源和云技术的发展。万全网络科技有限公司是一家专注于B端电商物流供应链的公司。致力于为客户提供全面的供应链解决方案,涵盖从产品采购到最终配送的全程服务。公司的服务包括但不限于:供应链管理,仓储与配送,信息技术支持。迁移背景在不断发展的科技环境中,企业往往需要不断调整和优化其技术基础设
StarRocks在千亿级日增数据场景下替换Greenplum的实践
StarRocks_labs
大数据 数据库 sql
原Greenplum集群在进行10亿*1亿的关联查询时达到极限,无法支撑更大数据量级的关联查询。使用StarRocks替换Greenplum构建新的集群,在进行736亿*15亿的超大量级数据关联查询时,不仅可以顺利完成,并且耗时很短,对业务的整体提升巨大。一、使用背景1.1选用原因我司原有业务查询使用的数据库为Greenplum,在数据源变更后,数据量从原来的日增千万级别(近百G)暴增至日增千亿(
聊聊Greenplum的那些事
weixin_30859423
数据库 python 运维
开卷有益——作者的话原文来自http://dbaplus.cn/news-21-341-1.html有时候真的感叹人生岁月匆匆,特别是当一个IT人沉浸于某个技术领域十来年后,蓦然回首,总有说不出的万千感慨。笔者有幸从04年就开始从事大规模数据计算的相关工作,08年作为Greenplum早期员工加入Greenplum团队(当时的工牌是“005”,哈哈),记得当时看了一眼Greenplum的架构(嗯,
(转)聊聊Greenplum的那些事
weixin_33908217
数据库 python 运维
开卷有益——作者的话有时候真的感叹人生岁月匆匆,特别是当一个IT人沉浸于某个技术领域十来年后,蓦然回首,总有说不出的万千感慨。笔者有幸从04年就开始从事大规模数据计算的相关工作,08年作为Greenplum早期员工加入Greenplum团队(当时的工牌是“005”,哈哈),记得当时看了一眼Greenplum的架构(嗯,就是现在大家耳熟能详的那个好多个X86框框的图),就义无反顾地加入了,转眼之间,
Spark——Spark读写Greenplum/Greenplum-Spark Connector高速写Greenplum
Southwest-
Spark spark 大数据 分布式
文章目录问题背景解决方式代码实现Spark写GreenplumSpark读Greenplum参考问题背景通过数据平台上的DataX把Hive表数据同步至Greenplum(因为DataX原生不支持GreenplumWriter,只能采用PostgreSQL驱动的方式),但是同步速度太慢了,"jdbc:postgresql://host:5432/db","user"->"u","password"
【无标题】KADB使用DBLINK连接KES验证
littlegirll
数据库 java sql
验证环境KADB版本:GreenplumDatabase6.0.0builddev.V003R002C001B0181.d354cc9215KES版本:KingbaseESV008R006C007B0012DBLINK环境准备KES创建用户KES修改参数,在kingbase.conf文件中,设置password_encryption=md5登录配置文件sys_hba.conf修改登录验证方式为md
KADB使用PXF连接KES验证
littlegirll
数据库
验证环境KADB版本:GreenplumDatabase6.0.0builddev.V003R002C001B0181.d354cc9215KES版本:KingbaseESV008R006C007B0012Java版本:openjdkversion"1.8.0_262"PXF部署以下操作假设KADB和KES已经部署完成并且启动正常,环境变量设置完成设置环境变量在mppadin用户的.bashrc文
《GreenPlum系列》GreenPlum初级教程-05GreenPlum语言DDL&DML&DQL
DATA数据猿
Greenplum 数据库 greenplum postgresql
文章目录第五章DDL&DML&DQL1.DDL(DataDefinitionLanguage)数据定义语言1.1创建数据库1.2查询数据库1.3删除数据库1.4创建表1.5修改表1.6清除表1.7删除表2.DML(DataManipulationLanguage)数据操作语言2.1数据导入2.2数据更新和删除2.3数据导出3.DQL(DataQueryLanguage)数据查询语言3.1基础语法及
Oracle 12CR2 RAC部署翻车,bug避坑经历
IT邦德
数据库 Oracle oracle bug 数据库
哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验一位上进心十足的【大数据领域博主】!中国DBA联盟(ACDU)成员,目前服务于工业互联网擅长主流Oracle、MySQL、PG、高斯及Greenplum运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。✨如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】❤️❤️❤️感谢各位大可爱小可爱!❤️❤️
【青梅资讯】VMware Greenplum 7 Beta版已正式发布
Greenplum中文社区
数据库 postgresql
VMwareGreenplum7.0Beta.0已于2022年12月15日正式发布,随后在2023年2月3日VMwareGreenplum7.0Beta.1也正式上线,现在让我们通过本文一起了解Greenplum7Beta.1和Beta.0版本都引入了哪些新功能和变化。VMwareGreenplum7.0Beta.1发布时间:2023年2月3日VMwareGreenplum7 Beta.1版本现在
技术分享 | OceanBase 集群扩容缩容
爱可生开源社区
技术分享 OceanBase OceanBase 资源扩缩容
作者:杨文DBA,负责客户项目的需求与维护,会点数据库,不限于MySQL、Redis、Cassandra、GreenPlum、ClickHouse、Elastic、TDSQL等等。本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。一、环境说明:集群扩容分为两种情况:一种是扩副本,一种是扩资源。原集群部署模式:1-1-1。下面介绍两种扩容方式:扩容副本:
greenplum 6 创建用户问题权限问题异常(创建只查视图用户)
圆子_f1fe
greenplum6创建用户问题权限问题异常(创建只查视图用户)解决普通用户默认无限制访问其它数据库问题;解决普通用户可以无限制建表问题;解决普通用户可以用navicat等工具查看系统原表问题;背景:我发现创建一个一个普通用户,在没有做特殊处理的情况下这个用户可以随意访问其它数据库,可以通过navicat等工具随意查看库的表名、函数、视图名等信息(虽然不可编辑,但是也不想让外部无关人员看到无关信息
使用benchmarksql对greenplum压测结果记录
YuVicky
本文将以TPC-C业界标准事务性能测试benchmark来展示Greenplum在事务上的处理能力。TPC-C简介TPC-C是由TPC(TransactionProcessingPerformanceCouncil,事务处理性能委员会)提供的专门针对联机交易处理系统的规范,TPC-C模拟的是一个大型的商品批发销售公司交易负载。这个事务负载主要由9张表组成,主要涉及5类交易类型:新订单生成(New-
【教程】集群搭建准备工作全流程
THE WHY
大数据 大数据 分布式 运维 hadoop 学习
基于VMware创建虚拟机进行集群搭建,适用于hadoop/GreenPlum等集群之前已经创建了三台虚拟机hadoop102,hadoop103,hadoop104来搭建hadoop集群,因为目前学习到了greemplum,因此新建三台虚拟机hadoop105,hadoop106,hadoop107来搭建greenplum集群,整体思路流程大致如下(仅包括虚拟机创建以及环境配置内容,不包括had
从Greenplum一个WARN的排查浅析PostgreSQL MemoryContext内存管理
airfan92
分布式 数据库 后端 postgresql 数据库 内存管理
Greenplum(GP)是一款开源的MPP数据库,兼容PostgreSQL生态。我们尝试基于开源GP支持多个副本,改造让集群从初始的最多只支持一个standbyMaster,到支持多个standby。相关实现并不复杂,内核和工具中没有太多对于standby个数的限制。经过多次的修改后,遗留的问题只剩下了一个:由一行代码引起的、但是找到这行代码花费了很久的WARN。本文就从这个WARN排查的角度,
PostgreSQL 自旋锁浅析
Greenplum中文社区
Greenplum内核机制 数据库 编程语言 java python 多线程
获得技术资料内容,请访问Greenplum中文社区网站什么是自旋锁经过上次的《PostgreSQL查询优化器详解》中大明和牛二哥对PostgreSQL优化器的概要的讲解,小明感到自己已经深深的爱上了数据库内核,小明在GitChat网站上购买了《PostgreSQL优化器入门》的文字网课,还跑到实体书店买了本《PostgreSQL技术内幕:查询优化深度探索》,每天对照着网课和书上的内容仔细研读Pos
数据库备份脚本嘎嘎香,被秀到了!
IT邦德
数据库 数据库
哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验一位上进心十足的【大数据领域博主】!中国DBA联盟(ACDU)成员,目前服务于工业互联网擅长主流Oracle、MySQL、PG、高斯及Greenplum运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。✨如果有对【数据库】感兴趣的【小可爱】,欢迎关注【IT邦德】❤️❤️❤️感谢各位大可爱小可爱!❤️❤️
《GreenPlum系列》GreenPlum初级教程-03GreenPlum系统管理
DATA数据猿
Greenplum 数据库 greenplum postgresql
文章目录第三章GreenPlum系统管理1.关于GreenPlum数据库发布版本号2.启动和停止GreenPlum数据库2.1启动数据库2.2重启数据库2.3仅重新载入配置文件更改2.4停止GreenPlum数据库2.5停止客户端进程3.GreenPlum数据库状态查询4.访问GreenPlum数据库4.1数据库会话参数4.2支持客户端应用4.3psql连接4.4常见的连接问题第三章GreenPl
Greenplum系统配置参数查看与设置
WESTWALL
查看参数数据库:postgres=#showall;系统:gpconfig--showmax_connections原文:https://yq.aliyun.com/articles/145445
GreenPlum的那些事《一》——GreenPlum数据库介绍
数据社
1.数据存储行式数据库是按照行存储的,行存储就是各行放入连续的物理位置,就行我们平时写字一样,一行一行的写,读取的时候也是一行一行的读取。像SQLserver,Oracle,mysql等传统的关系型数据库都属于行式数据库范畴。列式数据库是按照列存储的,列存储是把多行数据的每一列按照列存储在磁盘,就像一把数据写入excel表格中,每次按照列读取数据,像Vertica,GreenPlum,HBase(
《GreenPlum系列》GreenPlum详细入门教程02-GreenPlum安装
DATA数据猿
Greenplum greenplum 数据库
文章目录第二章GreenPlum安装1.Docker创建centos容器1.1拉取centos7镜像1.2创建容器1.3进入容器1.4容器和服务器免密操作1.4.1生成密钥1.4.2拷贝密钥1.5安装ssh服务和网络必须应用1.6容器设置root密码1.6.1安装passwd应用1.6.2容器本机root设置密码1.7容器本机免密2.安装GreenPlum2.1准备安装包2.2创建用户及用户组2.
greenplum使用总结之常用SQL及函数
CS枪王
# Greenplum 数据库 大数据
---------------------------------------------------建表等-----------------------------------------------------–创建序列–eg:CREATESEQUENCEusers181020_ID_seq2STARTWITH1003INCREMENTBY14NOMINVALUE5NOMAXVALUE6CAC
greenplum 历史拉链表
用心一
数据仓库 数据库 hive
3.1历史拉链表数据仓库定义:是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。历史拉链表:一种数据模型,主要是针对数据仓库设计中表存储数据的方式而定义的。它记录了一个事物从开始到当前状态的所有变化的信息。避免了按每一天存储所有记录造成的海量存储问题,同事也是处理缓慢变化数据的一种常见方式。3.1.1应用场景描述企业有5000万会员信息,每天有20万会员资料变更,每天
开发者关心的那些事
圣子足道
ios 游戏 编程 apple 支付
我要在app里添加IAP,必须要注册自己的产品标识符(product identifiers)。产品标识符是什么?
产品标识符(Product Identifiers)是一串字符串,它用来识别你在应用内贩卖的每件商品。App Store用产品标识符来检索产品信息,标识符只能包含大小写字母(A-Z)、数字(0-9)、下划线(-)、以及圆点(.)。你可以任意排列这些元素,但我们建议你创建标识符时使用
负载均衡器技术Nginx和F5的优缺点对比
bijian1013
nginx F5
对于数据流量过大的网络中,往往单一设备无法承担,需要多台设备进行数据分流,而负载均衡器就是用来将数据分流到多台设备的一个转发器。
目前有许多不同的负载均衡技术用以满足不同的应用需求,如软/硬件负载均衡、本地/全局负载均衡、更高
LeetCode[Math] - #9 Palindrome Number
Cwind
java Algorithm 题解 LeetCode Math
原题链接:#9 Palindrome Number
要求:
判断一个整数是否是回文数,不要使用额外的存储空间
难度:简单
分析:
题目限制不允许使用额外的存储空间应指不允许使用O(n)的内存空间,O(1)的内存用于存储中间结果是可以接受的。于是考虑将该整型数反转,然后与原数字进行比较。
注:没有看到有关负数是否可以是回文数的明确结论,例如
画图板的基本实现
15700786134
画图板
要实现画图板的基本功能,除了在qq登陆界面中用到的组件和方法外,还需要添加鼠标监听器,和接口实现。
首先,需要显示一个JFrame界面:
public class DrameFrame extends JFrame { //显示
linux的ps命令
被触发
linux
Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。
要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行
Android 音乐播放器 下一曲 连续跳几首歌
肆无忌惮_
android
最近在写安卓音乐播放器的时候遇到个问题。在MediaPlayer播放结束时会回调
player.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.reset();
Log.i("H
java导出txt文件的例子
知了ing
java servlet
代码很简单就一个servlet,如下:
package com.eastcom.servlet;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.sql.Connection;
import java.sql.Resu
Scala stack试玩, 提高第三方依赖下载速度
矮蛋蛋
scala sbt
原文地址:
http://segmentfault.com/a/1190000002894524
sbt下载速度实在是惨不忍睹, 需要做些配置优化
下载typesafe离线包, 保存为ivy本地库
wget http://downloads.typesafe.com/typesafe-activator/1.3.4/typesafe-activator-1.3.4.zip
解压r
phantomjs安装(linux,附带环境变量设置) ,以及casperjs安装。
alleni123
linux spider
1. 首先从官网
http://phantomjs.org/下载phantomjs压缩包,解压缩到/root/phantomjs文件夹。
2. 安装依赖
sudo yum install fontconfig freetype libfreetype.so.6 libfontconfig.so.1 libstdc++.so.6
3. 配置环境变量
vi /etc/profil
JAVA IO FileInputStream和FileOutputStream,字节流的打包输出
百合不是茶
java核心思想 JAVA IO操作 字节流
在程序设计语言中,数据的保存是基本,如果某程序语言不能保存数据那么该语言是不可能存在的,JAVA是当今最流行的面向对象设计语言之一,在保存数据中也有自己独特的一面,字节流和字符流
1,字节流是由字节构成的,字符流是由字符构成的 字节流和字符流都是继承的InputStream和OutPutStream ,java中两种最基本的就是字节流和字符流
类 FileInputStream
Spring基础实例(依赖注入和控制反转)
bijian1013
spring
前提条件:在http://www.springsource.org/download网站上下载Spring框架,并将spring.jar、log4j-1.2.15.jar、commons-logging.jar加载至工程1.武器接口
package com.bijian.spring.base3;
public interface Weapon {
void kil
HR看重的十大技能
bijian1013
提升 能力 HR 成长
一个人掌握何种技能取决于他的兴趣、能力和聪明程度,也取决于他所能支配的资源以及制定的事业目标,拥有过硬技能的人有更多的工作机会。但是,由于经济发展前景不确定,掌握对你的事业有所帮助的技能显得尤为重要。以下是最受雇主欢迎的十种技能。 一、解决问题的能力 每天,我们都要在生活和工作中解决一些综合性的问题。那些能够发现问题、解决问题并迅速作出有效决
【Thrift一】Thrift编译安装
bit1129
thrift
什么是Thrift
The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and s
【Avro三】Hadoop MapReduce读写Avro文件
bit1129
mapreduce
Avro是Doug Cutting(此人绝对是神一般的存在)牵头开发的。 开发之初就是围绕着完善Hadoop生态系统的数据处理而开展的(使用Avro作为Hadoop MapReduce需要处理数据序列化和反序列化的场景),因此Hadoop MapReduce集成Avro也就是自然而然的事情。
这个例子是一个简单的Hadoop MapReduce读取Avro格式的源文件进行计数统计,然后将计算结果
nginx定制500,502,503,504页面
ronin47
nginx 错误显示
server {
listen 80;
error_page 500/500.html;
error_page 502/502.html;
error_page 503/503.html;
error_page 504/504.html;
location /test {return502;}}
配置很简单,和配
java-1.二叉查找树转为双向链表
bylijinnan
二叉查找树
import java.util.ArrayList;
import java.util.List;
public class BSTreeToLinkedList {
/*
把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \
Netty源码学习-HTTP-tunnel
bylijinnan
java netty
Netty关于HTTP tunnel的说明:
http://docs.jboss.org/netty/3.2/api/org/jboss/netty/channel/socket/http/package-summary.html#package_description
这个说明有点太简略了
一个完整的例子在这里:
https://github.com/bylijinnan
JSONUtil.serialize(map)和JSON.toJSONString(map)的区别
coder_xpf
jquery json map val()
JSONUtil.serialize(map)和JSON.toJSONString(map)的区别
数据库查询出来的map有一个字段为空
通过System.out.println()输出 JSONUtil.serialize(map): {"one":"1","two":"nul
Hibernate缓存总结
cuishikuan
开源 ssh javaweb hibernate缓存 三大框架
一、为什么要用Hibernate缓存?
Hibernate是一个持久层框架,经常访问物理数据库。
为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能。
缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。
二、Hibernate缓存原理是怎样的?
Hibernate缓存包括两大类:Hib
CentOs6
dalan_123
centos
首先su - 切换到root下面1、首先要先安装GCC GCC-C++ Openssl等以来模块:yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel2、再安装ncurses模块yum -y install ncurses-develyum install ncurses-devel3、下载Erang
10款用 jquery 实现滚动条至页面底端自动加载数据效果
dcj3sjt126com
JavaScript
无限滚动自动翻页可以说是web2.0时代的一项堪称伟大的技术,它让我们在浏览页面的时候只需要把滚动条拉到网页底部就能自动显示下一页的结果,改变了一直以来只能通过点击下一页来翻页这种常规做法。
无限滚动自动翻页技术的鼻祖是微博的先驱:推特(twitter),后来必应图片搜索、谷歌图片搜索、google reader、箱包批发网等纷纷抄袭了这一项技术,于是靠滚动浏览器滚动条
ImageButton去边框&Button或者ImageButton的背景透明
dcj3sjt126com
imagebutton
在ImageButton中载入图片后,很多人会觉得有图片周围的白边会影响到美观,其实解决这个问题有两种方法
一种方法是将ImageButton的背景改为所需要的图片。如:android:background="@drawable/XXX"
第二种方法就是将ImageButton背景改为透明,这个方法更常用
在XML里;
<ImageBut
JSP之c:foreach
eksliang
jsp forearch
原文出自:http://www.cnblogs.com/draem0507/archive/2012/09/24/2699745.html
<c:forEach>标签用于通用数据循环,它有以下属性 属 性 描 述 是否必须 缺省值 items 进行循环的项目 否 无 begin 开始条件 否 0 end 结束条件 否 集合中的最后一个项目 step 步长 否 1
Android实现主动连接蓝牙耳机
gqdy365
android
在Android程序中可以实现自动扫描蓝牙、配对蓝牙、建立数据通道。蓝牙分不同类型,这篇文字只讨论如何与蓝牙耳机连接。
大致可以分三步:
一、扫描蓝牙设备:
1、注册并监听广播:
BluetoothAdapter.ACTION_DISCOVERY_STARTED
BluetoothDevice.ACTION_FOUND
BluetoothAdapter.ACTION_DIS
android学习轨迹之四:org.json.JSONException: No value for
hyz301
json
org.json.JSONException: No value for items
在JSON解析中会遇到一种错误,很常见的错误
06-21 12:19:08.714 2098-2127/com.jikexueyuan.secret I/System.out﹕ Result:{"status":1,"page":1,&
干货分享:从零开始学编程 系列汇总
justjavac
编程
程序员总爱重新发明轮子,于是做了要给轮子汇总。
从零开始写个编译器吧系列 (知乎专栏)
从零开始写一个简单的操作系统 (伯乐在线)
从零开始写JavaScript框架 (图灵社区)
从零开始写jQuery框架 (蓝色理想 )
从零开始nodejs系列文章 (粉丝日志)
从零开始编写网络游戏 
jquery-autocomplete 使用手册
macroli
jquery Ajax 脚本
jquery-autocomplete学习
一、用前必备
官方网站:http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/
当前版本:1.1
需要JQuery版本:1.2.6
二、使用
<script src="./jquery-1.3.2.js" type="text/ja
PLSQL-Developer或者Navicat等工具连接远程oracle数据库的详细配置以及数据库编码的修改
超声波
oracle plsql
在服务器上将Oracle安装好之后接下来要做的就是通过本地机器来远程连接服务器端的oracle数据库,常用的客户端连接工具就是PLSQL-Developer或者Navicat这些工具了。刚开始也是各种报错,什么TNS:no listener;TNS:lost connection;TNS:target hosts...花了一天的时间终于让PLSQL-Developer和Navicat等这些客户
数据仓库数据模型之:极限存储--历史拉链表
superlxw1234
极限存储 数据仓库 数据模型 拉链历史表
在数据仓库的数据模型设计过程中,经常会遇到这样的需求:
1. 数据量比较大; 2. 表中的部分字段会被update,如用户的地址,产品的描述信息,订单的状态等等; 3. 需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态, 比如,查看某一个用户在过去某一段时间内,更新过几次等等; 4. 变化的比例和频率不是很大,比如,总共有10
10点睛Spring MVC4.1-全局异常处理
wiselyman
spring mvc
10.1 全局异常处理
使用@ControllerAdvice注解来实现全局异常处理;
使用@ControllerAdvice的属性缩小处理范围
10.2 演示
演示控制器
package com.wisely.web;
import org.springframework.stereotype.Controller;
import org.spring