如何使用 pyspark 在 s3 上获取 csv(方案没有文件系统:s3n)

Fra*_*kie 3 python apache-spark pyspark

关于 SO 有很多类似的问题,但我根本无法让它发挥作用。我显然错过了一些东西。

试图从我的 s3 加载一个简单的测试 csv 文件。

在本地进行,如下所示,有效。

from pyspark.sql import SparkSession
from pyspark import SparkContext as sc

logFile = "sparkexamplefile.csv"
spark = SparkSession.builder.appName("SimpleApp").getOrCreate()

logData = spark.read.text(logFile).cache()

numAs = logData.filter(logData.value.contains('a')).count()
numBs = logData.filter(logData.value.contains('b')).count()

print("Lines with a: %i, lines with b: %i" % (numAs, numBs))
Run Code Online (Sandbox Code Playgroud)

但是如果我在下面添加这个:

sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", "foo")
sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", "bar")
lines = sc.textFile("s3n:///mybucket-sparkexample/sparkexamplefile.csv")
lines.count()
Run Code Online (Sandbox Code Playgroud)

我得到:

No FileSystem for scheme: s3n
Run Code Online (Sandbox Code Playgroud)

我也试图改变s3,以spark.sparkContext没有任何的区别

也在url 中交换/////

更好的是,我宁愿这样做并直接转到数据框:

dataFrame = spark.read.csv("s3n:///mybucket-sparkexample/sparkexamplefile.csv")
Run Code Online (Sandbox Code Playgroud)

另外我对 AWS 有点无知,所以我尝试了 s3、s3n 和 s3a 都无济于事。

我一直在互联网上转来转去,但似乎无法解决方案错误。谢谢!

Sah*_*sai 5

我认为你的火花环境没有得到 aws jars。您需要添加它以使用 s3 或 s3n。

您必须将所需的 jar 文件从 hadoop 下载复制到 $SPARK_HOME/jars 目录中。对 spark-submit 使用 --jars 标志或 --packages 标志不起作用。

在这里我的火花版本是Spark 2.3.0Hadoop 2.7.6 ,所以你必须从复制到罐子(hadoop dir)/share/hadoop/tools/lib/$SPARK_HOME/jars

aws-java-sdk-1.7.4.jar
hadoop-aws-2.7.6.jar
Run Code Online (Sandbox Code Playgroud)