Quelle est la façon la plus efficace de lire uniquement un sous-ensemble de colonnes dans spark à partir d'un fichier parquet qui contient plusieurs colonnes? Est-ce que l'utilisation de spark.read.format("parquet").load(<parquet>).select(...col1, col2)
est la meilleure façon de le faire? I préférerait également utiliser un ensemble de données typesafe avec des classes de cas pour prédéfinir mon schéma, mais je n'en suis pas sûr.
val df = spark.read.parquet("fs://path/file.parquet").select(...)
Cela ne lira que les colonnes correspondantes. En effet, le parquet est un rangement en colonne et il est exactement destiné à ce type de cas d'utilisation. Essayez d'exécuter df.explain
et spark vous dira que seules les colonnes correspondantes sont lues (il imprime le plan d'exécution). explain
vous dirait également quels filtres sont poussés vers le bas vers le plan physique d'exécution si vous utilisez également une condition where. Enfin, utilisez le code suivant pour convertir la trame de données (jeu de données de lignes) en un jeu de données de votre classe de cas.
case class MyData...
val ds = df.as[MyData]
Spark supporte les pushdowns avec Parquet donc
load(<parquet>).select(...col1, col2)
c'est bien.
Je préférerais également utiliser un ensemble de données typesafe avec des classes de cas pour prédéfinir mon schéma, mais je n'en suis pas sûr.
Cela pourrait être un problème, car il semble que certaines optimisations ne fonctionnent pas dans ce contexte Spark 2.0 Dataset vs DataFrame
Parquet est un format de fichier en colonnes. Il est exactement conçu pour ce type de cas d'utilisation.
val df = spark.read.parquet("<PATH_TO_FILE>").select(...)
devrait faire le travail pour vous.