web-dev-qa-db-fra.com

Un moyen efficace de lire des colonnes spécifiques du fichier parquet dans spark

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.

8
horatio1701d
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]
12
Oli

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

3
Alper t. Turker

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.

1
moriarty007