Apache spark Spark-从S3读取分区数据-分区是如何发生的?

Apache spark Spark-从S3读取分区数据-分区是如何发生的?,apache-spark,amazon-s3,Apache Spark,Amazon S3,当我使用Spark从S3读取多个文件时(例如,包含许多拼花文件的目录)—— 逻辑分区是否在开始时进行,然后每个执行器直接(在工作节点上)下载数据? 或者驱动程序下载数据(部分或全部),然后进行分区并将数据发送给执行者 此外,分区是否默认为用于写入的相同分区(即每个文件=1个分区)?S3上的数据显然是HDFS的外部数据 您可以通过提供一个或多个路径或使用配置单元元存储来读取S3—如果您已通过为外部S3表创建DDL、为分区使用MSCK或在EMR上为配置单元更改表表名恢复分区来更新此存储 如果您使用:

当我使用Spark从S3读取多个文件时(例如,包含许多拼花文件的目录)——
逻辑分区是否在开始时进行,然后每个执行器直接(在工作节点上)下载数据?
或者驱动程序下载数据(部分或全部),然后进行分区并将数据发送给执行者


此外,分区是否默认为用于写入的相同分区(即每个文件=1个分区)?

S3上的数据显然是HDFS的外部数据

您可以通过提供一个或多个路径或使用配置单元元存储来读取S3—如果您已通过为外部S3表创建DDL、为分区使用MSCK或在EMR上为配置单元更改表表名恢复分区来更新此存储

如果您使用:

val df = spark.read.parquet("/path/to/parquet/file.../...")
那么分区就没有保证,它取决于各种设置——请参阅,注意API会不断发展并变得更好

但是,这:

val df = spark.read.parquet("/path/to/parquet/file.../.../partitioncolumn=*")
将根据保存的分区结构以某种方式返回执行器上的分区,有点像SPARK bucketBy

驱动程序仅在直接指定S3时获取元数据

用你的话来说:

  • “…每个执行者直接下载数据(在工作节点上)?”是
  • 元数据是通过驱动程序协调和S3上文件/目录位置的其他系统组件以某种方式获得的,但数据并不是首先下载到驱动程序的,这在设计上是一个很大的愚蠢。但这也取决于API如何响应的语句格式