10W数据导入该如何与库中数据去重?

使用的是PostgreSQL

在做大数据量(十万级)导入时,某些字段和数据库表里数据(千万级)重复的需要排除掉,把表数据查询出来用程序的方式判断去重效率很低,于是考虑用临时表。

  1. 先把新数据插入到临时表里,临时表结构和原始表一致。
  2. 用SQL的方式把不重复的数据DataA查询出来。
  3. 把DataA插入到原始表里。

因为不重复的数据我还要做一些其他的处理,所以查出来DataA,若不需做特殊处理可直接使用 insert into select 的方式将第2步的数据插入到原始表,然后清空临时表

第2步有两种方式,一种是用 not exists 的方式,如

SELECT
	* 
FROM
	tableTemp t1 
WHERE
	NOT EXISTS ( SELECT 1 FROM tableName WHERE columnA = t1.columnA AND columnB = t1.columnB )

第二种方式是用 left join

SELECT
	* 
FROM
	tableTemp t1
	LEFT JOIN tableName t2 ON t2.columnA = t1.columnA AND t2.columnB = t2.columnB 
WHERE
	t2.columnA IS NULL

经测试(每个人的表结构和索引各有不同,我这里仅仅提供参考)

临时表数据量少时, not exists 用时较少,随着数据量越多用时越久。当数据达到10w时,用时25s。

临时表数据量少时,left join 用时30s,随着数据量越多变化不大,当数据达到10w时,用时40s。

结论1:单表去重时,只要导入的数据量不是特别特别大(20w级以上),优先使用 not exists 做去重。

但还有一种情况,就是需要对两个表做去重。

例如

SELECT
	* 
FROM
	tableTemp t1 
WHERE
	NOT EXISTS ( 
	SELECT 1 FROM tableNameA WHERE columnA = t1.columnA AND columnB = t1.columnB 
	union all
	select 1 from tableNameB WHERE columnA = t1.columnA AND columnB = t1.columnB 
	);

SELECT
	* 
FROM
	tableTemp t1
	LEFT JOIN tableNameA t2 ON t2.columnA = t1.columnA AND t2.columnB = t1.columnB 
	LEFT JOIN tableNameB t3 ON t3.columnA = t1.columnA AND t3.columnB = t1.columnB 
WHERE
	t2.columnA IS NULL
	AND t3.columnA IS NULL

这种情况下,

临时表数据少时,not exists 用时较少,随着数据量越多用时越久。当数据达到10w时,用时150s!!!。

临时表数据少时,left join 用时仍然是30s,随着数据量越多用时越久。当数据达到10w时,用时仍然是40s。

两者在数据量为3w时,用时不相上下

结论2:双表去重时,当导入的数据在3w以下时,用 not exists,在3w以上时,用 left join。

### 回答1: 可以这样写Python程序:import csv# 读取饭店订单详细数据文件 with open('detaill.csv', 'r') as f: reader = csv.reader(f) # 将订单数据保存到data data = [row for row in reader] # 去重处理 # 依据菜品种类构建字典,key为菜品种类,value为被去重的订单数据 dic = {} for row in data: # 获取菜品种类 key = row[1] # 如果菜品种类不在dic,则添加,否则跳过 if key not in dic: dic[key] = row# 将去重处理后的订单数据写入detaill.csv with open('detaill.csv', 'w', newline='') as f: writer = csv.writer(f) for row in dic.values(): writer.writerow(row)# 输出去从重前后的订单详情表形状 print('去重前订单详情表形状:' + str(len(data)) + '行' + str(len(data[0])) + '列') print('去重后订单详情表形状:' + str(len(dic)) + '行' + str(len(dic[list(dic.keys())[0]])) + '列') ### 回答2: 编写一个Python程序,实现读取饭店订单详细数据文件(detaill.csv)数据,根据菜品种类对订单数据进行去重处理,然后将去重后的数据写回detaill.csv,并输出去重后的订单详情表形状和去重后的订单详细表形状。 首先,需要导入所需的模块,如pandas。 ```python import pandas as pd ``` 接下来,使用pandas的read_csv函数读取detaill.csv文件的内容,并将其存储在一个DataFrame。 ```python data = pd.read_csv('detaill.csv') ``` 然后,使用drop_duplicates函数根据菜品种类对订单数据进行去重处理。 ```python data_unique = data.drop_duplicates(subset=['菜品种类']) ``` 将去重后的数据写回到detaill.csv文件。 ```python data_unique.to_csv('detaill.csv', index=False) ``` 最后,通过shape属性获取去重后的订单详情表和订单详细表的形状,并将其输出。 ```python print("去重后的订单详情表形状:", data_unique.shape) print("去重后的订单详细表形状:", data.shape) ``` 整个程序的完整代码如下: ```python import pandas as pd data = pd.read_csv('detaill.csv') data_unique = data.drop_duplicates(subset=['菜品种类']) data_unique.to_csv('detaill.csv', index=False) print("去重后的订单详情表形状:", data_unique.shape) print("去重后的订单详细表形状:", data.shape) ``` 运行以上代码,便可以实现读取饭店订单详细数据文件,并进行菜品种类去重处理,最后输出去重后的订单详情表和订单详细表的形状。 ### 回答3: 编写一个Python程序来处理饭店订单详细数据文件(detaill.csv)数据,根据菜品种类对订单数据进行去重处理,并将去重后的数据写回到detaill.csv文件。同时,程序会输出去重后的订单详情表的形状(行数和列数),以及去重后的订单详细表的形状。 首先,我们需要使用Python的csv模块来读取detaill.csv文件的数据。然后,我们将数据存储在一个列表,以便后续处理。 接下来,我们要对订单数据进行去重处理。我们可以使用Python的集合(set)数据结构来实现去重。我们创建一个空集合,并使用一个循环从订单数据列表逐个取出菜品种类,并将其添加到集合。由于集合的特性是不会重复存储相同的元素,因此自动完成了去重处理。 完成去重处理后,我们将去重后的数据重新写回到detaill.csv文件。我们使用csv的writer对象打开detaill.csv文件,并使用writerows方法将去重后的数据写入文件。 最后,我们可以通过获取去重后的数据列表的长度,来得到去重后的订单详情表的行数。此外,我们还可以通过查看去重后的第一条订单数据的长度,来得到去重后的订单详细表的列数。 整个程序的代码如下所示: ```python import csv # 读取detaill.csv文件的数据 with open('detaill.csv', 'r') as file: reader = csv.reader(file) data = list(reader) # 对订单数据进行去重处理 unique_data = list(set(tuple(row) for row in data)) # 将去重后的数据写回到detaill.csv文件 with open('detaill.csv', 'w', newline='') as file: writer = csv.writer(file) writer.writerows(unique_data) # 输出去重后的订单详情表的形状 num_rows = len(unique_data) num_cols = len(unique_data[0]) print(f"去重后的订单详情表的形状:{num_rows}行 x {num_cols}列") # 输出去重后的订单详细表的形状 num_rows = len(unique_data) num_cols = len(unique_data[0]) print(f"去重后的订单详细表的形状:{num_rows}行 x {num_cols}列") ``` 请注意,该程序假定detaill.csv文件已存在,并且文件的格式是以逗号作为分隔符的CSV格式。另外,程序的代码仅仅处理了去重,并未进行任何其他数据处理或验证。如果有其他需求,可以根据具体情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凡人编程传

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值