使用 python & pandas 处理大文件
Handle big files with python & pandas
感谢阅读我的post。
我需要处理大文件,让我给你更多的上下文,我从数据库中提取一些表格,将这些表格转换为 CSV,然后,我将它们转换为 JSON。
这就是将信息发送到 BigQuery。
现在我的脚本工作正常,但我有一个问题,我提取的一些表太大了,其中一个有 14 Gb,我的问题是我的服务器内存只有 8 Gb,存在任何方式将一些整合到我的拆分或附加信息的脚本 ???
我的脚本:
import pyodbc
import fileinput
import csv
import pandas as pd
import json
import os
import sys
conn = pyodbc.connect("Driver={SQL Server};"
"Server=TEST;"
"username=test;"
"password=12345;"
"Database=TEST;"
"Trusted_Connection=no;")
cursor = conn.cursor()
query = "SELECT * FROM placeholder where "
with open(r"D:\Test.txt") as file:
lines = file.readlines()
print(lines)
for user_input in lines:
result = query.replace("placeholder", user_input)
print(result)
sql_query = pd.read_sql(result,conn)
df = pd.DataFrame(sql_query)
user_inputs = user_input.strip("\n")
filename = os.path.join('D:\', user_inputs + '.csv')
df.to_csv (filename, index = False, encoding='utf-8', sep = '~', quotechar = "`", quoting=csv.QUOTE_ALL)
print(filename)
filename_json = os.path.join('D:\', user_inputs + '.jsonl')
csvFilePath = (filename)
jsonFilePath = (filename_json)
print(filename_json)
df_o = df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
df_o.to_json(filename_json, orient = "records", lines = True, date_format = "iso", double_precision = 15, force_ascii = False, date_unit = 'ms', default_handler = str)
dir_name = "D:\"
test = os.listdir(dir_name)
for item in test:
if item.endswith(".csv"):
os.remove(os.path.join(dir_name, item))
cursor.close()
conn.close()
我真的是 python 的新手,希望您能帮助我将一些内容集成到我的脚本中。
真的很感谢大家!!!
亲切的问候。
对于大型数据集,您应该避免一次读取所有数据然后一次写入所有数据。您应该进行部分读取和部分写入。
由于您使用的是 BigQuery,因此您应该使用 paritions 来限制查询输出。有一些逻辑来更新分区偏移量。对于每个分区,您可以为每个分区生成一个文件。在这种情况下,您的输出将类似于 output-1.csv、output-2.csv 等
使用分区的例子:
SELECT * FROM placeholder
WHERE transaction_date >= '2016-01-01'
作为奖励提示,请避免这样做 Select * 因为 BigQuery 是列式存储系统,提及您想要阅读的列将显着提高性能。
感谢阅读我的post。
我需要处理大文件,让我给你更多的上下文,我从数据库中提取一些表格,将这些表格转换为 CSV,然后,我将它们转换为 JSON。
这就是将信息发送到 BigQuery。
现在我的脚本工作正常,但我有一个问题,我提取的一些表太大了,其中一个有 14 Gb,我的问题是我的服务器内存只有 8 Gb,存在任何方式将一些整合到我的拆分或附加信息的脚本 ???
我的脚本:
import pyodbc
import fileinput
import csv
import pandas as pd
import json
import os
import sys
conn = pyodbc.connect("Driver={SQL Server};"
"Server=TEST;"
"username=test;"
"password=12345;"
"Database=TEST;"
"Trusted_Connection=no;")
cursor = conn.cursor()
query = "SELECT * FROM placeholder where "
with open(r"D:\Test.txt") as file:
lines = file.readlines()
print(lines)
for user_input in lines:
result = query.replace("placeholder", user_input)
print(result)
sql_query = pd.read_sql(result,conn)
df = pd.DataFrame(sql_query)
user_inputs = user_input.strip("\n")
filename = os.path.join('D:\', user_inputs + '.csv')
df.to_csv (filename, index = False, encoding='utf-8', sep = '~', quotechar = "`", quoting=csv.QUOTE_ALL)
print(filename)
filename_json = os.path.join('D:\', user_inputs + '.jsonl')
csvFilePath = (filename)
jsonFilePath = (filename_json)
print(filename_json)
df_o = df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
df_o.to_json(filename_json, orient = "records", lines = True, date_format = "iso", double_precision = 15, force_ascii = False, date_unit = 'ms', default_handler = str)
dir_name = "D:\"
test = os.listdir(dir_name)
for item in test:
if item.endswith(".csv"):
os.remove(os.path.join(dir_name, item))
cursor.close()
conn.close()
我真的是 python 的新手,希望您能帮助我将一些内容集成到我的脚本中。
真的很感谢大家!!!
亲切的问候。
对于大型数据集,您应该避免一次读取所有数据然后一次写入所有数据。您应该进行部分读取和部分写入。
由于您使用的是 BigQuery,因此您应该使用 paritions 来限制查询输出。有一些逻辑来更新分区偏移量。对于每个分区,您可以为每个分区生成一个文件。在这种情况下,您的输出将类似于 output-1.csv、output-2.csv 等
使用分区的例子:
SELECT * FROM placeholder
WHERE transaction_date >= '2016-01-01'
作为奖励提示,请避免这样做 Select * 因为 BigQuery 是列式存储系统,提及您想要阅读的列将显着提高性能。