Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/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
Amazon s3 在拼花地板Pypark中插入_Amazon S3_Pyspark_Etl_Parquet - Fatal编程技术网

Amazon s3 在拼花地板Pypark中插入

Amazon s3 在拼花地板Pypark中插入,amazon-s3,pyspark,etl,parquet,Amazon S3,Pyspark,Etl,Parquet,我在s3中有拼花地板文件,其中包含以下分区: 年/月/日期/某些id 使用Spark(PySpark),每天我都想把最后14天的数据上传到s3中(每个分区一个拼花文件),但不想删除14天之前的数据。。 我尝试了两种保存模式: append-不好,因为它只是添加了另一个文件。 覆盖-删除过去的数据和其他分区的数据 有什么方法或最佳实践可以克服这个问题吗?我是否应该在每次运行中读取s3中的所有数据,然后再次写回?也许重命名这些文件,以便append将替换s3中的当前文件 非常感谢 据我所知,S3没有

我在s3中有拼花地板文件,其中包含以下分区: 年/月/日期/某些id 使用Spark(PySpark),每天我都想把最后14天的数据上传到s3中(每个分区一个拼花文件),但不想删除14天之前的数据。。 我尝试了两种保存模式: append-不好,因为它只是添加了另一个文件。 覆盖-删除过去的数据和其他分区的数据

有什么方法或最佳实践可以克服这个问题吗?我是否应该在每次运行中读取s3中的所有数据,然后再次写回?也许重命名这些文件,以便append将替换s3中的当前文件


非常感谢

据我所知,S3没有更新操作。将对象添加到s3后,将无法修改。(必须替换另一个对象或附加文件)


不管怎么说,您需要读取所有数据,您可以指定要读取的时间线,分区修剪有助于仅读取时间线内的分区。

我通常会做类似的事情。在我的例子中,我执行ETL并将一天的数据附加到拼花地板文件中:

关键是处理要写入的数据(在我的例子中是实际日期),确保按
date
列进行分区,并覆盖当前日期的所有数据

这将保留所有旧数据。例如:

(
自卫队
写
.格式(“拼花地板”)
.mode(“覆盖”)
.分割人(“日期”)
.选项(“替换位置”,“2020-01-27”)
.save(uri)
)

另外,您还可以看看哪个是拼花地板格式的扩展,它提供了一些有趣的功能,如ACID交易。

感谢所有有用的解决方案。 最后,我使用了一些为我的用例服务的配置—在编写拼花地板时使用覆盖模式,以及以下配置:

我添加了以下配置:

spark.conf.set("spark.sql.sources.partitionOverwriteMode", "dynamic")
使用此配置,spark将只覆盖其有数据要写入的分区。所有其他(过去的)分区保持不变-请参见此处: