当我使用Spark从S3读取多个文件时(例如,包含很多Parquet文件的目录)-
逻辑分区是否在开始时就发生了,然后每个执行程序都直接在工作节点上下载数据?
或者驱动程序是否会下载数据(部分或全部),然后才进行分区并将数据发送给执行者?
此外,该分区是否默认为用于写入的分区(即每个文件= 1个分区)?
答案 0 :(得分:3)
S3上的数据显然在HDFS外部。
您可以通过提供一个或多个路径或使用Hive Metastore来从S3中读取-如果已通过创建用于外部S3表的DDL,使用MSCK用于分区或使用ALTER TABLE table_name RECOVER PARTITIONS用于Hive在EMR上进行了更新,
如果您使用:
val df = spark.read.parquet("/path/to/parquet/file.../...")
然后不能保证分区,它取决于各种设置-请参见Does Spark maintain parquet partitioning on read?,请注意API会不断发展并变得更好。
但是,这:
val df = spark.read.parquet("/path/to/parquet/file.../.../partitioncolumn=*")
将按照保存的分区结构以某种方式通过执行程序返回分区,有点像SPARK bucketBy。
仅在直接指定S3时,驱动程序才获取元数据。
以您的说法: