Apache spark Pyspark S3A跨帐户角色的访问被拒绝异常

Apache spark Pyspark S3A跨帐户角色的访问被拒绝异常,apache-spark,pyspark,amazon-iam,aws-glue,aws-sts,Apache Spark,Pyspark,Amazon Iam,Aws Glue,Aws Sts,我设置了一个AWS粘合作业来处理另一个AWS帐户B中存在的S3文件。帐户A中的IAM角色(粘合作业IAM角色)使用STS来承担帐户B中的角色,该角色提供对我所需文件的访问。帐户B的IAM角色与帐户A中的粘合作业角色具有信任关系。我能够打印访问密钥和密钥,因此假设STS工作正常 我得到以下错误: 调用o83.json时发生错误。com.amazon.ws.emr.hadoop.fs.shade.com.amazonaws.services.s3.model.amazons3异常:拒绝访问(服务:a

我设置了一个AWS粘合作业来处理另一个AWS帐户B中存在的S3文件。帐户A中的IAM角色(粘合作业IAM角色)使用STS来承担帐户B中的角色,该角色提供对我所需文件的访问。帐户B的IAM角色与帐户A中的粘合作业角色具有信任关系。我能够打印访问密钥和密钥,因此假设STS工作正常

我得到以下错误:

调用o83.json时发生错误。com.amazon.ws.emr.hadoop.fs.shade.com.amazonaws.services.s3.model.amazons3异常:拒绝访问(服务:amazon s3;状态代码:403;错误代码:拒绝访问;

当我遇到访问被拒绝异常时,S3A连接器的正确实现是什么

这是我的密码:

from\uuuuu future\uuuuu导入打印功能
从pyspark导入SparkContext
从pyspark导入SparkConf
从pyspark导入SQLContext
从pyspark.sql导入SparkSession
从pyspark.sql导入行
从pyspark.sql.functions导入col
从pyspark.sql.types导入*
从pyspark.sql导入HiveContext
从pyspark.sql.functions导入explode
从pyspark.sql.functions导入explode\u outer
从pyspark.sql.functions导入子字符串索引
从pyspark.sql.functions导入输入文件名
从pyspark.sql导入函数为f
导入系统
导入操作系统
导入操作系统
进口boto3
导入系统
输入错误号
导入时间
导入日期时间
从日期时间导入时间增量,日期
从pyspark.sql.functions导入拆分
从pyspark.sql.functions导入子字符串
从boto3.session导入会话
火花=火花会话\
建筑商先生\
.appName(“JsonInputFormat”)\
.enableHiveSupport()\
.getOrCreate()\
sc=spark.sparkContext
配置单元上下文=配置单元上下文(sc)
hive_context.setConf(“hive.exec.dynamic.partition”,“true”)
hive_context.setConf(“hive.exec.dynamic.partition.mode”,“nonstrict”)
hive_context.setConf(“hive.serialization.extend.nesting.levels”,“true”)
sqlCtx=HiveContext(sc)
client=bot3.client('sts')
response=client.aspect_role(RoleArn='role_TO_aspect',RoleSessionName='AssumeRoleSession1')
凭据=响应['credentials']
ACCESS\u KEY=凭证['AccessKeyId']
SECRET\u KEY=凭证['SecretAccessKey']
打印('访问键为{}'。格式(访问键))
打印('密钥为{}'。格式(密钥))
打印(“Hadoop版本:”+sc.\u gateway.jvm.org.apache.Hadoop.util.VersionInfo.getVersion())
会话=会话(aws\u访问\u密钥\u id=访问\u密钥,aws\u机密\u访问\u密钥=机密\u密钥)
s3=会话资源('s3')
spark.jsc.hadoopConfiguration().set(“fs.s3a.access.key”,access\u key)
spark.jsc.hadoopConfiguration().set(“fs.s3a.secret.key”,secret\u key)
spark.jsc.hadoopConfiguration().set(“com.amazonaws.services.s3a.enableV4”,“true”)
spark.jsc.hadoopConfiguration().set(“fs.s3a.endpoint”,“s3-us-east-1.amazonaws.com”)
spark.jsc.hadoopConfiguration().set(“fs.s3a.impl”、“org.apache.hadoop.fs.s3a.S3AFileSystem”)
def展平模式(模式):
“”“将架构作为从架构()返回的内容。jsonValue()
并返回具有完整路径“”的字段名列表
def_展平(模式,路径=”,累计=无):
#提取当前元素的名称
name=schema.get(“name”)
#如果有名称扩展路径
如果名称不是None:
path=“{0}.{1}”。如果路径为其他名称,则格式化(路径,名称)
打印('路径为{}'。格式(路径))
#它是某种结构
如果isinstance(schema.get(“字段”),请列出:
对于schema.get中的字段(“字段”):
_展平(场、路径、累积)
elif isinstance(schema.get(“type”),dict):
_展平(schema.get(“type”)、路径、累计)
#它是一种原子类型
其他:
累计追加(路径)
累计=[]
_展平(模式,“,累计)
返回累计
sqlCtx.sql(“set spark.sql.caseSensitive=true”)
昨天=日期.今天()-timedelta(1)
daybefore=昨天.strftime(“%Y-%m-%d”)
currentdate=time.strftime(“%Y-%m-%d”)
key='key={}'。格式(str(daybefore))
bucket='BUKCET_NAME'
df_base=spark.read.json('s3a://{}/{}/*/'.format(bucket,key))
base_schema=df_base.schema
datePrefix=str(前一天)
source='s3a://{}/{}.格式(bucket,key)
df1=spark.read.json(源代码,schema=base\u schema)
schema=df1.schema.jsonValue()
列列表=展平模式(模式)
打印('列列表为{}'。格式(列列表))
df2=df1.选择(*(列(x).别名(x.replace('.',''))表示列列表中的x))
打印('df2为{}'。格式(df2))
df3=df2。选择(“*”,分解外部(df2.contents)。别名(“contents\u flat”))
df3=df3.删除(“内容”)
打印('df3为{}'。格式(df3))
schema4=df3.schema.jsonValue()
columns\u list4=展平\u模式(schema4)
打印('列列表4为{}'。格式(列列表4))
df5=df3.选择(*(列(x).alias(x.replace('.',''))表示第4列中的x))
打印('df5为{}'。格式(df5))
schema5=df5.schema.jsonValue()
columns\u list5=展平\u模式(schema5)
打印('列列表5为{}'。格式(列列表5))
df6=df5.选择(*(列(x).别名(x.replace('contents_flat','contents'))作为列(列表5)中的x)
打印('df6为{}'。格式(df6))
schema6=df6.schema.jsonValue()
columns_list6=展平模式(schema6)
打印('列列表6为{}'。格式(列列表6))
df7=df6。选择(*(列6中x的列(x))#在下面编辑的行上方
schema7=df7.schema.jsonValue()
打印('schema7为{}'。格式(schema7))
columns\u list7=展平\u模式(schema7)
打印('列列表7为{}'。格式(列列表7))
df7=df7.选择(*(列(x).alias(x.replace('.',''),''列7中x的别名))
df7=df7。选择(“*”,分解外部(df7.业务地址警告)。别名(“业务地址警告”)
df7=df7.drop(“业务地址警告”)
打印('df7为{}'。格式(df7))
df8=df7.withColumn(“文件名”,输入文件名()
split_col=split(df8['filename'],'short_date=')
df9=df8.withColumn('shortfilename',split\u col.getItem(1))
df_final=df9.withColumn('filedate',substring('shortfilename',1,10)).drop('shortfilename')
打印('df_最终版