在大型gzip文件中替换字符
我正在尝试替换一些字符,以便我的 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)