z********4 发帖数: 1668 | 1 我有一个1000多w手机用户在一天中的位置数据,这套数据记录了每个用户在当天每半
小时所在的cell tower的id(所以一天总共48个)。
原始数据都存在文本文件里,每半小时有一个文本文件,文本文件中每行为phone
number和一个tower id。不敢保证是不是每个文本文件中出现的phone number都一致。
我需要把这些数据进到一张表里,也就意味着1000w rows * 49 columns (1 phone
number + 48 tower ids)。
之前很少接触数据库,所以目前的土办法效率不是很高:分别处理所有文本文件。对于
每个文本文件中的每一行,搜索数据库表中这个phone number存不存在(phone number
为primary key),如果不存在就insert这个用户(同时insert的还有这个用户在该时
间段所
在的tower id),存在则update这个用户在该时间段所在的tower id)。
这么做非常慢,一个晚上大概新建几十万条,一个文本文件都处理不好。感觉连续跑一
周都不能完成。求好的建议!
我的环境为:win7 + postgresql。读写数据库用的java + postgresql jdbc。 |
p***c 发帖数: 5202 | 2 试试看专门的ETL工具,opensource的有不少
自己写的话至少要cache 电话号码到memory里面(还要refresh如果有新的号码),不
要每次都去查那个表 |
B*****g 发帖数: 34098 | 3 都有啥opensource
【在 p***c 的大作中提到】 : 试试看专门的ETL工具,opensource的有不少 : 自己写的话至少要cache 电话号码到memory里面(还要refresh如果有新的号码),不 : 要每次都去查那个表
|
l******t 发帖数: 660 | 4 在amazon上买几个node, 写一个简单的map-reduce job就可以了
或者自己写multi-threading job也行
number
【在 z********4 的大作中提到】 : 我有一个1000多w手机用户在一天中的位置数据,这套数据记录了每个用户在当天每半 : 小时所在的cell tower的id(所以一天总共48个)。 : 原始数据都存在文本文件里,每半小时有一个文本文件,文本文件中每行为phone : number和一个tower id。不敢保证是不是每个文本文件中出现的phone number都一致。 : 我需要把这些数据进到一张表里,也就意味着1000w rows * 49 columns (1 phone : number + 48 tower ids)。 : 之前很少接触数据库,所以目前的土办法效率不是很高:分别处理所有文本文件。对于 : 每个文本文件中的每一行,搜索数据库表中这个phone number存不存在(phone number : 为primary key),如果不存在就insert这个用户(同时insert的还有这个用户在该时 : 间段所
|
l******t 发帖数: 660 | 5 其实用纯database 也可以解决, 你一个一个record处理当然很慢, 你可以bulk load文
本文件到一个临时表, 不要用jdbc, 然后join temp table to target table, do
merge operation, database set operation 应该比你用java 一个一个record快.
number
【在 z********4 的大作中提到】 : 我有一个1000多w手机用户在一天中的位置数据,这套数据记录了每个用户在当天每半 : 小时所在的cell tower的id(所以一天总共48个)。 : 原始数据都存在文本文件里,每半小时有一个文本文件,文本文件中每行为phone : number和一个tower id。不敢保证是不是每个文本文件中出现的phone number都一致。 : 我需要把这些数据进到一张表里,也就意味着1000w rows * 49 columns (1 phone : number + 48 tower ids)。 : 之前很少接触数据库,所以目前的土办法效率不是很高:分别处理所有文本文件。对于 : 每个文本文件中的每一行,搜索数据库表中这个phone number存不存在(phone number : 为primary key),如果不存在就insert这个用户(同时insert的还有这个用户在该时 : 间段所
|
l******t 发帖数: 660 | 6 pentaho啊, 最用名也最有用的
【在 B*****g 的大作中提到】 : 都有啥opensource
|
B*****g 发帖数: 34098 | 7 收费吗?
【在 l******t 的大作中提到】 : pentaho啊, 最用名也最有用的
|
l******t 发帖数: 660 | 8 personal的不收, enterprise edition要
【在 B*****g 的大作中提到】 : 收费吗?
|
B*****g 发帖数: 34098 | 9 那没用,personal谁用ETL干哈?
【在 l******t 的大作中提到】 : personal的不收, enterprise edition要
|
l******t 发帖数: 660 | 10 也不是personal, 说出来, 是community edition, 比enterprise edition要少很多
feature, 不过公司还是可以用.
【在 B*****g 的大作中提到】 : 那没用,personal谁用ETL干哈?
|
|
|
p***c 发帖数: 5202 | 11 综合楼上所述,
应该是ETL到一个Temp table啥的,然后selfjoin, whatever join on phone number
搞成48个column,我看成
lookup做upsert怎么都是最慢的,我吃过苦头 |
c****e 发帖数: 1453 | 12 You can run a simple map-reduce job to get distinct phone number.
You can consider Redis + HBase.I don't know your exact scenario, but this
should cover both update and query |
v*****r 发帖数: 1119 | 13 其实在一个够 powerful 的数据库里可以 simulate map-reduce。
要做一个和 lz 类似的 project, 我准备比较一下用 amzaon 和用自己的数据库的
performance 的区别,觉得数据库会完胜
【在 l******t 的大作中提到】 : 在amazon上买几个node, 写一个简单的map-reduce job就可以了 : 或者自己写multi-threading job也行 : : number
|
d****n 发帖数: 12461 | 14 是不是应该(timestamp,phone number,tower id)分别建一条记录啊,而不是
phonenumber,tx_0000,tx_0030,tx_0100,tx_0130这样建,这样不满足范式啊。
而且先入库,再处理重复的问题,会容易很多啊。
number
【在 z********4 的大作中提到】 : 我有一个1000多w手机用户在一天中的位置数据,这套数据记录了每个用户在当天每半 : 小时所在的cell tower的id(所以一天总共48个)。 : 原始数据都存在文本文件里,每半小时有一个文本文件,文本文件中每行为phone : number和一个tower id。不敢保证是不是每个文本文件中出现的phone number都一致。 : 我需要把这些数据进到一张表里,也就意味着1000w rows * 49 columns (1 phone : number + 48 tower ids)。 : 之前很少接触数据库,所以目前的土办法效率不是很高:分别处理所有文本文件。对于 : 每个文本文件中的每一行,搜索数据库表中这个phone number存不存在(phone number : 为primary key),如果不存在就insert这个用户(同时insert的还有这个用户在该时 : 间段所
|
d****n 发帖数: 12461 | 15 而且任何表结构都是为业务逻辑服务的。
所以最好了解一下业务逻辑是啥。到底是要做用户的定位还是做热点的统计,等等。 |
l*******s 发帖数: 1258 | 16 我觉得没必要上什么map reduce啊 云啥的
瓶颈在查表那块 每次都要看某个phone number是否在表中 很慢的
你干脆搞一个hash,table或者set都行,key就是phone number
用查询这个hash代替查询数据库,会快很多,这样对db的操作就只有insert和update了
当然了 记得insert table时,也要把phone number加到hash里
1000w个phone number,每个4Byte,一共也就是1000w x 4 = 40M内存
(算错了请提醒)
内存完全放得下,用空间换时间
还有个技巧就是,每次cache 1w个update或者insert操作,然后一起commit到db,这样
能快些,加上prepared statement。你要是每次一个个commit,会慢。 |
B*****g 发帖数: 34098 | 17 nod
【在 l*******s 的大作中提到】 : 我觉得没必要上什么map reduce啊 云啥的 : 瓶颈在查表那块 每次都要看某个phone number是否在表中 很慢的 : 你干脆搞一个hash,table或者set都行,key就是phone number : 用查询这个hash代替查询数据库,会快很多,这样对db的操作就只有insert和update了 : 当然了 记得insert table时,也要把phone number加到hash里 : 1000w个phone number,每个4Byte,一共也就是1000w x 4 = 40M内存 : (算错了请提醒) : 内存完全放得下,用空间换时间 : 还有个技巧就是,每次cache 1w个update或者insert操作,然后一起commit到db,这样 : 能快些,加上prepared statement。你要是每次一个个commit,会慢。
|
l*******s 发帖数: 1258 | 18 我觉得没必要上什么map reduce啊 云啥的
瓶颈在查表那块 每次都要看某个phone number是否在表中 很慢的
你干脆搞一个hash,table或者set都行,key就是phone number
用查询这个hash代替查询数据库,会快很多,这样对db的操作就只有insert和update了
当然了 记得insert table时,也要把phone number加到hash里
1000w个phone number,每个4Byte,一共也就是1000w x 4 = 40M内存
(算错了请提醒)
内存完全放得下,用空间换时间
还有个技巧就是,每次cache 1w个update或者insert操作,然后一起commit到db,这样
能快些,加上prepared statement。你要是每次一个个commit,会慢。 |
h********3 发帖数: 2075 | 19 你是不是没有用JDBC里面的Batch?还设有,把setAutoCommit成为false。
number
【在 z********4 的大作中提到】 : 我有一个1000多w手机用户在一天中的位置数据,这套数据记录了每个用户在当天每半 : 小时所在的cell tower的id(所以一天总共48个)。 : 原始数据都存在文本文件里,每半小时有一个文本文件,文本文件中每行为phone : number和一个tower id。不敢保证是不是每个文本文件中出现的phone number都一致。 : 我需要把这些数据进到一张表里,也就意味着1000w rows * 49 columns (1 phone : number + 48 tower ids)。 : 之前很少接触数据库,所以目前的土办法效率不是很高:分别处理所有文本文件。对于 : 每个文本文件中的每一行,搜索数据库表中这个phone number存不存在(phone number : 为primary key),如果不存在就insert这个用户(同时insert的还有这个用户在该时 : 间段所
|
w*r 发帖数: 2421 | |
|
|
p****7 发帖数: 641 | 21 这个数据不算大, MySQL都只要几个小时. 怎么会那样慢呢?
number
【在 z********4 的大作中提到】 : 我有一个1000多w手机用户在一天中的位置数据,这套数据记录了每个用户在当天每半 : 小时所在的cell tower的id(所以一天总共48个)。 : 原始数据都存在文本文件里,每半小时有一个文本文件,文本文件中每行为phone : number和一个tower id。不敢保证是不是每个文本文件中出现的phone number都一致。 : 我需要把这些数据进到一张表里,也就意味着1000w rows * 49 columns (1 phone : number + 48 tower ids)。 : 之前很少接触数据库,所以目前的土办法效率不是很高:分别处理所有文本文件。对于 : 每个文本文件中的每一行,搜索数据库表中这个phone number存不存在(phone number : 为primary key),如果不存在就insert这个用户(同时insert的还有这个用户在该时 : 间段所
|
N**********d 发帖数: 9292 | 22 有什么bulk load的好例子吗?我最近也在琢磨这个。。。
【在 l******t 的大作中提到】 : 其实用纯database 也可以解决, 你一个一个record处理当然很慢, 你可以bulk load文 : 本文件到一个临时表, 不要用jdbc, 然后join temp table to target table, do : merge operation, database set operation 应该比你用java 一个一个record快. : : number
|
f*******h 发帖数: 1269 | 23 你的数据库需要每小时更新保持精确吗?还是每天更新一次就行?
如果是前者, JDBC insert/update非常慢,不可取。
一个办法是,你别insert/update, 把所有数据用数据库的loading tool直接load进去
。然后对某个用户查询的时候写个stored procedure,把这个用户(phone number
primary key)的所有结果后续处理一下,产生tower的时间位置信息。
1000w个记录的loading时间,应该在2-3分钟。查询的时间,应该是1秒内,因为phone
number is the PK. 如果你查询更复杂,那这种办法也许不可行。
如果是后者,所有数据用MapReduce merge后(几分钟或者更快),输出表格需要的数据
格式
到文件,再用load工具导入,如果有24组1000w数据,半小时可以导入完。
另外,有不少loading tool支持并行导入,可以用多个CPU cores.
number
【在 z********4 的大作中提到】 : 我有一个1000多w手机用户在一天中的位置数据,这套数据记录了每个用户在当天每半 : 小时所在的cell tower的id(所以一天总共48个)。 : 原始数据都存在文本文件里,每半小时有一个文本文件,文本文件中每行为phone : number和一个tower id。不敢保证是不是每个文本文件中出现的phone number都一致。 : 我需要把这些数据进到一张表里,也就意味着1000w rows * 49 columns (1 phone : number + 48 tower ids)。 : 之前很少接触数据库,所以目前的土办法效率不是很高:分别处理所有文本文件。对于 : 每个文本文件中的每一行,搜索数据库表中这个phone number存不存在(phone number : 为primary key),如果不存在就insert这个用户(同时insert的还有这个用户在该时 : 间段所
|
w*******j 发帖数: 70 | 24 If I were you , I would keep all these records in a table up to certain
history ...
in a relational database, this would be a table (PhoneDetails) with such
structure:
guid phonenumber towerid timestamp
there will be another table (optional, Phone) with phonenumber as primary
key (or partial key, if another user table exists, a user can have many
phone numbers)...
Phone has a one to many relationship to PhoneDetails.
there will be some tasks to update Phone table with new phone numbers, or
you can just query and get distict from details table if you have only one
table.
.......
number
【在 z********4 的大作中提到】 : 我有一个1000多w手机用户在一天中的位置数据,这套数据记录了每个用户在当天每半 : 小时所在的cell tower的id(所以一天总共48个)。 : 原始数据都存在文本文件里,每半小时有一个文本文件,文本文件中每行为phone : number和一个tower id。不敢保证是不是每个文本文件中出现的phone number都一致。 : 我需要把这些数据进到一张表里,也就意味着1000w rows * 49 columns (1 phone : number + 48 tower ids)。 : 之前很少接触数据库,所以目前的土办法效率不是很高:分别处理所有文本文件。对于 : 每个文本文件中的每一行,搜索数据库表中这个phone number存不存在(phone number : 为primary key),如果不存在就insert这个用户(同时insert的还有这个用户在该时 : 间段所
|