在PySpark中读取具有不同身份验证令牌的两个文件

在PySpark中读取具有不同身份验证令牌的两个文件,pyspark,Pyspark,我正在使用PySpark将几个文件读入数据帧,并执行它们的联合。由于这两个文件具有不同的权限授予,因此我使用org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider来读取这两个文件。但是,当我尝试读取第二个文件时,我遇到了一个错误(我可以单独读取,但不能一起读取) 读取文件的代码: def read_文件(文件路径、文件id): aws\u tokens=获取\u文件(文件\u id)的\u aws\u tokens\u spark.jsc

我正在使用
PySpark
将几个文件读入数据帧,并执行它们的联合。由于这两个文件具有不同的权限授予,因此我使用
org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider
来读取这两个文件。但是,当我尝试读取第二个文件时,我遇到了一个错误(我可以单独读取,但不能一起读取)

读取文件的代码:

def read_文件(文件路径、文件id):
aws\u tokens=获取\u文件(文件\u id)的\u aws\u tokens\u
spark.jsc.hadoopConfiguration().set('fs.s3a.access.key',aws\u access\u key)
spark.jsc.hadoopConfiguration().set('fs.s3a.secret.key',aws\u secret\u key)
spark.jsc.hadoopConfiguration().set('fs.s3a.session.token',aws\u session\u token)
spark.jsc.hadoopConfiguration().set('fs.s3a.connection.ssl.enabled','true')
spark.jsc.hadoopConfiguration().set(“fs.s3a.aws.credentials.provider”、“org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider”)
df=spark.read.parquet(文件路径)
返回df
现在,以下内容在两个不同的pyspark会话中起作用:

df1=读取文件(文件路径,文件id)
df2=读取文件(文件路径,文件id)
但是,当我尝试以下操作时,它失败了,出现了
java.nio.file.AccessDeniedException

df1=读取文件(文件路径,文件id)
df2=读取文件(文件路径,文件id)
df3=df1.联合(df2)
打印(df3.count())
这样做的一个原因可能是,只有在执行某个操作时,才会从
s3
读取文件,并且在执行该操作时,两个文件所需的aws凭据不同

因此,我尝试持久化第一个文件,然后读取第二个文件,但也失败了,出现了相同的异常:

df1=读取文件(文件路径,文件id)
_=df1.persist(StorageLevel.MEMORY\u和\u DISK).count()
df2=读取文件(文件路径,文件id)#本身在这里失败

那么,如何合并需要不同aws身份验证凭据的两个文件呢?

Spark进行按需计算,包括读取数据。S3A文件系统类的实例也将被bucket URI缓存……只有当bucket不同时,更改配置才会生效


您可以使用每个存储桶设置更改不同s3存储桶的凭据/凭据提供程序。如果您的数据在不同的存储桶中,那么这应该是可行的。查看hadoop s3文档了解详细信息。

如何重置
s3a文件系统类的实例?数据集在同一个存储桶中,但我无权访问每个存储桶。我使用的API只向特定的数据集授予凭据。如果两个源都来自同一个bucket,则每个bucket设置将不适用于您。相反,您可以考虑使用由“OLIK1”解释的自定义文件系统,但是您需要了解java,然后添加jar来启动…