Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.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

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
Apache spark 为什么Delta Lake似乎存储了这么多冗余信息?_Apache Spark_Amazon S3_Delta Lake - Fatal编程技术网

Apache spark 为什么Delta Lake似乎存储了这么多冗余信息?

Apache spark 为什么Delta Lake似乎存储了这么多冗余信息?,apache-spark,amazon-s3,delta-lake,Apache Spark,Amazon S3,Delta Lake,我刚开始使用delta lake,所以我的心智模型可能不适用-我问这个问题是为了验证/反驳它 我对delta lake的理解是,它只存储对数据的增量更改(“delta”)。有点像git—每次进行提交时,都不会存储代码库的整个快照—提交只包含所做的更改。 类似地,我会设想,如果我创建一个增量表,然后尝试用表中已经包含的所有内容“更新”该表(即“空提交”),那么我就不会期望看到由于该更新而创建的任何新数据 然而,这不是我观察到的:这样的更新似乎与现有表重复。发生什么事?对我来说,这似乎不是很“增量”

我刚开始使用delta lake,所以我的心智模型可能不适用-我问这个问题是为了验证/反驳它

我对delta lake的理解是,它只存储对数据的增量更改(“delta”)。有点像git—每次进行提交时,都不会存储代码库的整个快照—提交只包含所做的更改。 类似地,我会设想,如果我创建一个增量表,然后尝试用表中已经包含的所有内容“更新”该表(即“空提交”),那么我就不会期望看到由于该更新而创建的任何新数据

然而,这不是我观察到的:这样的更新似乎与现有表重复。发生什么事?对我来说,这似乎不是很“增量”

(为了可读性,我将替换文件名中的实际UUID值)

#创建数据
dataGen=sc.\u jvm.org.apache.hudi.QuickstartUtils.DataGenerator()
inserts=sc.\u jvm.org.apache.hudi.QuickstartUtils.convertToStringList(dataGen.generateInserts(200))
df=spark.read.json(spark.sparkContext.parallelize(insert,2))
delta_base_path=“s3://my delta table/test”
(df.write.format(“增量”)
.mode(“覆盖”)
.save(delta_base_path))
然后我使用完全相同的数据集覆盖:

(df.write.format("delta")
 .mode("overwrite")
 .save(delta_base_path))

!aws s3 ls --recursive s3://my-delta-table/test
2020-10-19 14:53:02       1620 test/_delta_log/00000000000000000000.json
2020-10-19 14:53:08        872 test/_delta_log/00000000000000000001.json
2020-10-19 14:53:01          0 test/_delta_log_$folder$
2020-10-19 14:53:07       6906 test/part-00000-UUID1-c000.snappy.parquet
2020-10-19 14:53:01       6906 test/part-00000-UUID3-c000.snappy.parquet
2020-10-19 14:53:07       6956 test/part-00001-UUID2-c000.snappy.parquet
2020-10-19 14:53:01       6956 test/part-00001-UUID4-c000.snappy.parquet

现在有两个大小完全相同的
part-0
part-1
s。为什么Delta不删除现有数据?

这不是完全正确的理解-Delta不会自动检查现有数据的重复项-如果您只想存储新的/更新的数据,那么您需要使用它来检查现有数据,然后您可以决定如何处理现有数据-使用新数据覆盖,或者忽略这一点


您可以在Delta的网站上找到更多信息,或者在Learning Spark的第9章,2ed book(它的)

FYI中找到更多信息:Git会在每次提交时存储每个更改文件的完整版本。令人惊讶的是,我知道
(df.write.format("delta")
 .mode("overwrite")
 .save(delta_base_path))

!aws s3 ls --recursive s3://my-delta-table/test
2020-10-19 14:53:02       1620 test/_delta_log/00000000000000000000.json
2020-10-19 14:53:08        872 test/_delta_log/00000000000000000001.json
2020-10-19 14:53:01          0 test/_delta_log_$folder$
2020-10-19 14:53:07       6906 test/part-00000-UUID1-c000.snappy.parquet
2020-10-19 14:53:01       6906 test/part-00000-UUID3-c000.snappy.parquet
2020-10-19 14:53:07       6956 test/part-00001-UUID2-c000.snappy.parquet
2020-10-19 14:53:01       6956 test/part-00001-UUID4-c000.snappy.parquet