Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何控制pyarrow.dataset.write_dataset是覆盖以前的数据还是附加到以前的数据?_Python_Pyarrow - Fatal编程技术网

Python 如何控制pyarrow.dataset.write_dataset是覆盖以前的数据还是附加到以前的数据?

Python 如何控制pyarrow.dataset.write_dataset是覆盖以前的数据还是附加到以前的数据?,python,pyarrow,Python,Pyarrow,我正在尝试使用pyarrow.dataset.write\u dataset函数将数据写入hdfs。但是,如果我写入一个已经存在并且有一些数据的目录,那么数据将被覆盖,而不是创建一个新文件。有没有一种方法可以方便地“附加”到已经存在的数据集,而不必先读入所有数据?我不需要将数据放在一个文件中,我只是不想删除旧文件 我目前做什么和不做什么: import pyarrow.dataset as ds parquet_format = ds.ParquetFileFormat() write_opti

我正在尝试使用
pyarrow.dataset.write\u dataset
函数将数据写入hdfs。但是,如果我写入一个已经存在并且有一些数据的目录,那么数据将被覆盖,而不是创建一个新文件。有没有一种方法可以方便地“附加”到已经存在的数据集,而不必先读入所有数据?我不需要将数据放在一个文件中,我只是不想删除旧文件

我目前做什么和不做什么:

import pyarrow.dataset as ds
parquet_format = ds.ParquetFileFormat()
write_options = parquet_format.make_write_options(
use_deprecated_int96_timestamps = True,
coerce_timestamps = None, 
allow_truncated_timestamps = True)
ds.write_dataset(data = data, base_dir = 'my_path', filesystem = hdfs_filesystem, format = parquet_format, file_options = write_options)

目前,
write\u dataset
函数使用固定的文件名模板(
part-{i}.parquet
,其中
i
是一个计数器,如果您写入多个批次;如果写入单个表,
i
将始终为0)

这意味着,当多次写入同一目录时,如果这些文件名为
part-0.parquet
,它可能确实会覆盖预先存在的文件

解决此问题的方法是确保
write\u数据集
通过
basename\u模板
参数为每次写入使用唯一的文件名,例如:

ds.write\u数据集(data=data,base\u dir='my\u path',
basename_template='my-unique-name-{i}.parquet',…)
如果您想在每次写入时自动拥有一个唯一的名称,您可以生成一个随机字符串以包含在文件名中。其中一个选项是使用python
uuid
stdlib模块:
basename\u template=“part-{i}-”+uuid.uuid4().hex+”.parquet“
。 另一个选项是在文件名中包含当前写入时间以使其唯一,例如使用
basename_template=“part-{:%Y%m}-{{i}}.parquet.”格式(datetime.datetime.now())


有关这方面的更多讨论,请参见(自定义模板),我专门打开了一个新的问题,关于静默覆盖数据的问题:

谢谢您的回答并打开了票据!因此,我是否正确理解,分区数据集的当前行为有时会导致覆盖,有时会追加数据,这取决于名称是否与给定分区中的文件匹配?(默认行为是我认为每个分区的计数器递增1)事实上,根据它将写入/已经存在的部分的数量,您可以得到覆盖/追加的混合(我认为这肯定是我们应该修复的,我打开了)。现在在实践中,它取决于传递给
write\u数据集的
数据。如果它是内存中的表,则始终只会写入“part-0.parquet”。如果它是一个分区数据集本身(例如来自不同的文件格式),那么实际上可以编写许多部分。