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 在spark中重新使用s3铲斗之前,如何正确卸下/清理s3铲斗?_Apache Spark_Amazon S3 - Fatal编程技术网

Apache spark 在spark中重新使用s3铲斗之前,如何正确卸下/清理s3铲斗?

Apache spark 在spark中重新使用s3铲斗之前,如何正确卸下/清理s3铲斗?,apache-spark,amazon-s3,Apache Spark,Amazon S3,我在jupyter笔记本上工作,使用spark 2.0.1创建spark数据帧,然后将其保存到python中的s3。代码看起来像 action = 'CREATE' if action == 'CREATE': df = dfA.filter(...) df = df.join(...) df.coalesce(4).write.format('parquet').save('s3://my/path') elif action == 'LOAD': df = s

我在jupyter笔记本上工作,使用spark 2.0.1创建spark数据帧,然后将其保存到python中的s3。代码看起来像

action = 'CREATE'
if action == 'CREATE':
    df = dfA.filter(...)
    df = df.join(...)
    df.coalesce(4).write.format('parquet').save('s3://my/path')
elif action == 'LOAD':
    df = spark.read.parquet('s3://my/path')
df2 = read_from_s3()
我想在某个时候,我遇到了一个bug,并编写了一个df,其中有4个项目(4个用于特定查询),而它应该只有2个项目(每个记录都是重复的-可能是因为我加入了一些东西,而没有先对其进行重复消除)

在重新工作之后,我可以验证当我删除旧的s3://my/path并运行创建逻辑以便它可以写入位置时,我的df是否有我期望的2项

我感到困惑的是,如果我现在运行加载逻辑,它应该加载数据帧,我只是错了2项,用从s3读取的数据替换我的df,我会得到一个数据帧,其中有错误的4项

如果我从一个新路径开始,
s3://my/path2
,那么这个创建和加载的练习就可以了


这似乎是s3的一个bug,或者是spark

这不是一个bug,可能是s3的行为,它对新对象的put具有读写一致性,对覆盖put和删除对象具有最终一致性。当你删除一个数据时,它可能会在列表中出现一段时间,但最终在删除完全传播到所有区域后,它会列出正确的数据。(

我喜欢@madhan-s的答案,但我的覆盖/重读都是以交互方式完成的,在aws s3上重新加载页面,检查对象不在时我无法读取,因此我不确定这是否解释了它(但感谢链接!我需要学习这类内容!)

可能发生的事情是,我想是我干的

df = make_bad_df()
df.save_to_s3()
df = read_from_s3()
df.persist()
在这一点上,我会持久化从特定s3对象读取的数据帧——如果我删除并重新写入s3存储桶,然后执行类似的操作

action = 'CREATE'
if action == 'CREATE':
    df = dfA.filter(...)
    df = df.join(...)
    df.coalesce(4).write.format('parquet').save('s3://my/path')
elif action == 'LOAD':
    df = spark.read.parquet('s3://my/path')
df2 = read_from_s3()

Spark无法知道s3对象已更改,可能Spark会说-啊哈!我已经保存了该数据帧,我将从内存/本地磁盘获取它?

-不,spark不会这样做。如果要保留数据集,请不要使用变量。是的,S3的一致性看起来让事情变得更糟了。