Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/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 3.x 从pyspark作业在s3存储桶中动态创建文件夹_Python 3.x_Amazon Web Services_Amazon S3_Pyspark - Fatal编程技术网

Python 3.x 从pyspark作业在s3存储桶中动态创建文件夹

Python 3.x 从pyspark作业在s3存储桶中动态创建文件夹,python-3.x,amazon-web-services,amazon-s3,pyspark,Python 3.x,Amazon Web Services,Amazon S3,Pyspark,我正在将数据写入s3 bucket,并使用pyspark创建拼花文件。我的桶结构如下所示: s3a://rootfolder/subfolder/table/ 子文件夹和表如果文件夹不存在,则应在运行时创建这两个文件夹,如果文件夹存在,则拼花地板文件应位于文件夹表中 当我在本地机器上运行pyspark程序时,它会用$folder$(如table$folder$)创建额外的文件夹,但如果从emr运行相同的程序,它会成功创建 writing into s3: (pyspark program)

我正在将数据写入s3 bucket,并使用pyspark创建拼花文件。我的桶结构如下所示:

s3a://rootfolder/subfolder/table/
子文件夹和表如果文件夹不存在,则应在运行时创建这两个文件夹,如果文件夹存在,则拼花地板文件应位于文件夹表中

当我在本地机器上运行pyspark程序时,它会用$folder$(如
table$folder$
)创建额外的文件夹,但如果从emr运行相同的程序,它会成功创建

writing into s3: (pyspark program)
 data.write.parquet("s3a://rootfolder/sub_folder/table/", mode="overwrite")

如果s3中不存在文件夹,是否有办法只在s3中创建文件夹,而不要创建表$folder$或带有u SUCCESS的文件夹。

一般来说,正如s3上的评论中所提到的,一切都是Bucket或Object:
writing into s3: (pyspark program)
 data.write.parquet("s3a://rootfolder/sub_folder/table/", mode="overwrite")
然而,文件夹结构更像是一种直观的表示,而不是传统文件系统中的实际层次结构

因此,您只需要创建bucket,而不需要创建文件夹。只有当bucket+键组合已经存在时,它才会失败

关于$folder$,我不确定,我还没有看到,它似乎是由Hadoop创建的:

关于_成功文件: 这基本上表明,您的工作已成功完成。 您可以通过以下方式禁用它:

sc.hadoopConfiguration.set("mapreduce.fileoutputcommitter.marksuccessfuljobs", "false")
s3a连接器(
org.apache.hadoop.fs.s3a.S3AFileSystem
)不会创建
$folder$
文件。它生成路径+/,作为目录标记。例如,
mkdir s3a://bucket/a/b
创建一个零字节标记对象
/a/b/
。这将它与文件区别开来,文件的路径为
/a/b

  • 如果您在本地使用的是
    s3n
    :URL。住手。使用S3a连接器
  • 如果您一直在设置
    fs.s3a.impl
    选项:停止它。hadoop知道使用什么,它使用S3AFileSystem类
  • 如果您看到它们并且正在运行EMR,那么这就是EMR的连接器。源代码已关闭,超出范围

  • 如果数据已经存在,它将抛出一个错误,我询问文件夹是否存在,让它存在,但实际上,如果它不存在,它应该在s3 bucket中创建文件夹,这正在发生,但如果我从本地计算机运行作业,则会有一个额外的文件夹具有足够的foldername_$folder$,如果我在aws emr中运行,那么它将以_SUCCESS创建。请注意,S3没有文件夹。“文件夹”只是两个斜杠之间键的一部分。您不能在S3.I ma中使用带有pyspark的以下配置创建文件夹:return SparkSession\.builder\.appName(app\u name)\.config('spark.cassandra.connection.host','localhost')\.config('spark.cassandra.connection.port','9042')\.config(“spark.serializer”,“org.apache.spark.serializer.KryoSerializer”)\.config(“spark.executor.memory”,“3g”)\.config(“spark.driver.memory”,“3g”)\.config(“spark.executor.cores”,“2”)\.config(“fs.s3a.impl”,“org.apache.hadoop.fs.s3native.NativeS3FileSystem”)\如果我没有使用config(“fs.s3a.impl”,“org.apache.hadoop.fs.s3native.NativeS3FileSystem”)\它会抛出erorr“java.lang.NoSuchMethodError:com.amazonaws.services.s3.transfer.TransferManagerConfiguration.SetMultiportupLoadThreshold(I)V”如果要使$folder$消失,可以整理类路径。请阅读hadopop s3a文档。将s3a impl更改为Natives3文件系统意味着“我想将s3n连接器与s3a URL一起使用”