在大型gzip文件中替换字符

0 投票
1 回答
786 浏览
提问于 2025-04-18 16:02

我正在尝试替换一些字符,以便我的 Hive 输出可以被 Pandas 正确读取为 DataFrame。

我首先尝试的是:

f2 = gzip.open(local_path, 'rb')
table = f2.read()
f2.close()

table = table.replace('\x01','\t')
table = table.replace('\\N','NULL')

f = gzip.open(local_path,'wb')
f.write(table) <-----ERROR
f.close()

但是在上面标记的地方出现了错误,提示“OverflowError: size does not fit in an int”。接下来我想到了这个方法:

input_file = gzip.open(local_path, 'rb')
output_file = gzip.open(output_path, 'wb')
for line in input_file:
    line = line.replace('\x01','\t')
    line = line.replace('\\N','NULL')
    output_file.write(line)
output_file.close()
input_file.close() 
os.rename(output_path,local_path) 

但我担心这样做会非常慢。有没有更好的方法呢?

如果这对解决方案有帮助,我这样做是为了能够调用:

return = pd.read_table(local_path,compression='gzip')

Pandas 在处理 Hive 输出字符时非常麻烦,所以必须在之前明确处理一下。

1 个回答

1

其实,pandas在处理Hive输出参数方面表现得非常好,只要你同时指定na_values和分隔符就可以了。

df =  pd.read_table(local_path,compression='gzip',na_values='\\N',sep='\x01')    

唯一可能的问题是以压缩格式保存数据。通常的做法是使用pickle。

df.to_pickle(output_path)

如果你遇到这个问题:如何对DataFrame进行pickle,那么你就需要把它保存为一个大文件。

df.to_csv(output_path)

撰写回答