【问题标题】:How to read parquet data from S3 to spark dataframe Python?如何从 S3 读取镶木地板数据以触发 Python 数据框?
【发布时间】:2017-11-21 14:05:03
【问题描述】:

我是 Spark 的新手,但我找不到这个...我有很多镶木地板文件上传到 s3 的位置:

s3://a-dps/d-l/sco/alpha/20160930/parquet/

这个文件夹的总大小是20+ Gb,。如何分块并将其读入数据帧 如何将所有这些文件加载​​到数据框中?

为 Spark 集群分配的内存为 6 GB。

    from pyspark import SparkContext
    from pyspark.sql import SQLContext
    from pyspark import SparkConf
    from pyspark.sql import SparkSession
    import pandas
    # SparkConf().set("spark.jars.packages","org.apache.hadoop:hadoop-aws:3.0.0-alpha3")
    sc = SparkContext.getOrCreate()

    sc._jsc.hadoopConfiguration().set("fs.s3.awsAccessKeyId", 'A')
    sc._jsc.hadoopConfiguration().set("fs.s3.awsSecretAccessKey", 's')

    sqlContext = SQLContext(sc)
    df2 = sqlContext.read.parquet("s3://sm/data/scor/alpha/2016/parquet/*")

错误:

Py4JJavaError:调用 o33.parquet 时出错。 :java.io.IOException:方案没有文件系统:s3 在 org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2660) 在 org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667) 在 org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94) 在 org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703) 在 org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685) 在 org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373) 在 org.apache.hadoop.fs.Path.getFileSystem(Path.java:295) 在 org.apache.spark.sql.execution.datasources.DataSource$$anonfun$14.apply(DataSource.scala:372) 在 org.apache.spark.sql.execution.datasources.DataSource$$anonfun$14.apply(DataSource.scala:370) 在 scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241) 在 scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:241) 在 scala.collection.immutable.List.foreach(List.scala:381) 在 scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:241) 在 scala.collection.immutable.List.flatMap(List.scala:344)

【问题讨论】:

  • 还需要在spark文件夹中添加包:org.apache.hadoop:hadoop-aws:3.0.0-alpha3, org.apache.httpcomponents:httpclient:4.3.6, org.apache。 httpcomponents:httpcore:4.3.3, com.amazonaws:aws-java-sdk-core:1.10.27, com.amazonaws:aws-java-sdk-s3:1.10.27, com.amazonaws:aws-java-sdk- sts:1.10.27
  • 也许这个要点可以帮助你:gist.github.com/asmaier/5768c7cda3620901440a62248614bbd0

标签: python apache-spark amazon-s3 pyspark


【解决方案1】:

您使用的文件架构 (s3) 不正确。您需要使用 s3n 架构或 s3a(对于更大的 s3 对象):

// use sqlContext instead for spark <2 
val df = spark.read 
              .load("s3n://bucket-name/object-path")

我建议您阅读有关Hadoop-AWS module: Integration with Amazon Web Services Overview 的更多信息。

【讨论】:

  • 这是否意味着我应该更改 AWS S3 中的某些内容以将 url 设为 s3n 而不是 s3?或者我可以在代码中盲目使用 s3n 代替 s3
  • 如果您提供了凭据,s3n 就足够了。有时它可能需要你提供一个端点,就像我在这里描述的 stackoverflow.com/questions/44589563/…
  • 还有怎么分块呢?
  • 什么意思?
  • 该文件夹中有许多 .parquet 文件。总共有 20+ gb,但我的 spark 只有 6 gb 空间。那么,它必须读入一个 df 意味着我需要读入 4 个块?
【解决方案2】:

自 Spark 2.0 起,您必须使用 SparkSession 而不是 sqlContext

spark = SparkSession.builder
                        .master("local")             
                        .appName("app name")             
                        .config("spark.some.config.option", true).getOrCreate()

df = spark.read.parquet("s3://path/to/parquet/file.parquet")

【讨论】:

  • Rmbr 将s3改为s3a
猜你喜欢
  • 1970-01-01
  • 2019-07-29
  • 2021-08-26
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 2019-11-16
  • 2017-12-16
  • 2018-06-24
相关资源
最近更新 更多