AVERTISSEMENT: je n'ai pas de réponse définitive et ne voulons pas agir comme une source fiable, mais ils ont passé un peu de temps sur le parquet de soutien Spark 2.2+ et j'espère que ma réponse peut nous aider tous à se rapprocher de la bonne réponse.
Ne Parquet sur S3 éviter de tirer sur les données pour les colonnes à partir de S3 et de récupérer uniquement le fichier de morceaux dont il a besoin, ou faut-il tirer tout le fichier?
J'utilise Étincelle 2.3.0-INSTANTANÉ que j'ai construit aujourd'hui dès le master.
parquet
format de source de données est gérée par ParquetFileFormat qui est un FileFormat.
Si je suis correct, la lecture de la première partie est assurée par buildReaderWithPartitionValues méthode (qui remplace l' FileFormat
s').
buildReaderWithPartitionValues
est utilisé exclusivement en FileSourceScanExec
opérateur physique est demandée pour l'entrée Rdd qui sont en fait une seule RDD pour générer de l'intérieur des lignes lorsqu' WholeStageCodegenExec
est exécutée.
Avec cela dit, je pense que l'examen de ce qu' buildReaderWithPartitionValues
ne peut nous rapprocher de la réponse finale.
Quand vous regardez la ligne , vous pouvez obtenir assurés que nous sommes sur la bonne voie.
// Essayez de pousser à la baisse les filtres lorsque le filtre push-bas est activé.
Que le chemin d'accès du code dépend spark.sql.parquet.filterPushdown
Étincelle de la propriété qui est activé par défaut.
spark.sql.parquet.filterPushdown Permet de Parquet filtre push-down optimisation lorsque la valeur true.
Qui nous conduit à parquet-hadoop est ParquetInputFormat.setFilterPredicate iff les filtres sont définis.
if (pushed.isDefined) {
ParquetInputFormat.setFilterPredicate(hadoopAttemptContext.getConfiguration, pushed.get)
}
Le code devient plus intéressant un peu plus tard, lorsque les filtres sont utilisés lorsque le code revient à parquet-m. (plutôt que d'utiliser la soi-disant vectorisé parquet décodage du lecteur). C'est la partie que je ne comprends pas vraiment (sauf ce que je peux voir dans le code).
Veuillez noter que le vectorisé parquet de décodage lecteur est contrôlé par spark.sql.parquet.enableVectorizedReader
Étincelle de la propriété qui est activée par défaut.
ASTUCE: Pour savoir quelle partie de l' if
expression est utilisée, activer DEBUG
niveau d'enregistrement d' org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormat
enregistreur.
Pour voir tous les poussés vers le bas les filtres vous pourriez tourner INFO
niveau d'enregistrement de l' org.apache.spark.sql.execution.FileSourceScanExec
logger sur. Vous devriez voir le suivant dans les logs:
INFO Pushed Filters: [pushedDownFilters]
J'espère que si c'est pas près d'être une réponse définitive, il a aidé un peu et quelqu'un le ramasse où je l'ai laissée, pour en faire un bientôt. L'espoir meurt en dernier :)