我尝试使用以下命令读取s3上的 parquet 文件,但同时出现以下错误:
java.lang.RuntimeException: java.lang.ClassNotFoundException: Class
org.apache.hadoop.fs.s3a.S3AFileSystem not found
以下是我尝试过的两种方法:
spark = SparkSession.builder \
.appName("my_app") \
.getOrCreate()
spark._jsc.hadoopConfiguration().set("com.amazonaws.services.s3.enableV4",
"true")
spark._jsc.hadoopConfiguration().set("fs.s3a.impl",
"org.apache.hadoop.fs.s3a.S3AFileSystem")
spark._jsc.hadoopConfiguration().set("fs.s3a.aws.credentials.provider",
"com.amazonaws.auth.InstanceProfileCredentialsProvider,com.amazonaws.auth.DefaultAWSCredenti
alsProviderChain")
spark._jsc.hadoopConfiguration().set("fs.AbstractFileSystem.s3a.impl",
"org.apache.hadoop.fs.s3a.S3A")
df = spark.read.parquet("s3a://path/datalake/blueprints/bp_blueprint_1/data/entrytime_month=2022-06/00000-1042-0846a7a2-2353-403d-879a-9ed3dcb11f72-00001.parquet")
我也尝试过这种方法:
spark = SparkSession.builder.master("local").appName("app name").getOrCreate()
df = spark.read.parquet("s3a://path/datalake/blueprints/bp_blueprint_1/data/entrytime_month=2022-06/00000-1042-0846a7a2-2353-403d-879a-9ed3dcb11f72-00001.parquet")
我也尝试过这样做,但我得到的是一个字节输出作为主体:
import boto3
s3_client = boto3.client('s3')
bucket = 'yeah-foundry'
key = 'lake/blueprints/bp_blueprint_1/data/403d-879a-9ed3dcb11f72-00001.parquet'
response = s3_client.get_object(Bucket=bucket, Key = key)
data = response['Body'].read()
print(data)
上面显示了一个奇怪的字节,如下所示:
如果可以的话请帮忙,不要Pandas的解决方案,只有pyspark。
1条答案
按热度按时间r3i60tvu1#
为了能够读写s3,您需要
aws-java-sdk
和hadoop-aws
依赖项,实际上,org.apache.hadoop.fs.s3a.S3AFileSystem
来自hadoop-aws
jar。您可以从以下网址获得这些信息:
从这两个链接中,您需要选择要使用的版本(这将取决于您想要什么,您使用的Hadoop版本,...)并下载两个
.jar
文件。在本地获得
.jar
文件后,需要将它们添加到运行Spark的机器上的$SPARK_HOME/jars
目录中,这样就将这些依赖项添加到了类路径中,使您能够在代码中使用它们。完成此操作后,应该删除
ClassNotFoundException
希望这有帮助!