Databricks (SPARK) : réparer toutes les tables partitionnées d’un seul coup

Si vous avez des tables partitionnées dans votre metastore HIVE-Spark et que vos données sont écrites sur le stockage dans des sous-répertoires partitionnées (/<pathToTable>/<partitionName>=<value>/) par un autre traitement que Spark ou Hive (Azure Stream Analytics, Event Hub, Azure Function ….), par exemple :

  • /logs/day=2019-08-10/
  • /logs/day=2019-08-11/

Les tables partitionnées ne verront pas les données des nouveaux répertoires tant qu’il n’existera pas de partition spécifiquement crée pour ce sous répertoire.

Mais heureusement il est possible de recréer automatiquement toutes les partition d’une table partitionnée avec la commande MSCK REPAIR <TABLENAME>, ce qui est plutôt pratique mais c’est à faire à la main pour chaque table ! https://docs.cloudera.com/HDPDocuments/HDP3/HDP-3.1.0/using-hiveql/content/hive-msck-repair.html

Maintenant, si vous voulez réparer toutes les partitions de toutes les tables partitionnées d’un seul coup, je vous propose le script pyspark suivant qui boucle sur toutes les bases et toutes les tables afin de les réparer (seulement si elles sont partitionnées bien sûr) :

#Repair partition foreach tables

df_databases = spark.sql("show databases")

for database in df_databases.collect():
  dbname = database.databaseName
  print(dbname)
  query = "use " + dbname 
  spark.sql(query)
  df_tables = spark.sql("show tables")
  
  for table in df_tables.collect():
    tablename = table.tableName
    print("_" + tablename)
    query = "DESCRIBE DETAIL " + tablename
    
    try:
      df_desc = spark.sql(query)
      nb_partitionColumn = len(df_desc.select("partitionColumns").take(1)[0][0])
      if nb_partitionColumn > 0:
        print("__" + tablename + " : is a partition table")
        query = "MSCK REPAIR TABLE " + tablename
        spark.sql(query).collect()
      else:
        print("__" + tablename + " : is not a partition table")
    except:
      print("__" + tablename + " : error with the table")

Ce script est compatible avec tout ce qui lance du Spark et du PySpark, donc Azure Databricks ! Il peut aussi être utilisé lors d’une migration de HDInsight Spark vers Databricks ou d’un workspace Databricks vers un autre workspace :

  1. Vous rejouez les create table sur le workspace cible en faisant bien attention à faire pointer les locations des tables vers les stockages sources existants (Azure Blob / Azure Data Lake Store…)
  2. Vous jouez le script dans un notebook python
  3. Magie toutes les partitions sont recrées !

FADATA

Fabien Adato est Customer Engineer Data et AI chez Microsoft. Après avoir intégré la société CGI Business Consulting où il rejoint une équipe dédiée à la Business Intelligence, il fait ses premières armes sur la solution Microsoft SQL Server. Pendant plus de 4 ans, il acquiert des compétences techniques et fonctionnelles sur toute la chaîne de valeur de la BI (ETL, Base de Données, Cube Olap et Rapport). Il a pu se spécialiser également sur de nouvelles technologies de la Data et notamment Hadoop, Pig et Hive, ainsi que des technologies self-service BI, le No-SQL comme la base de données MongoDB et le moteur d’indexation ElasticSearch. Il entre chez AZEO en 2014 puis Avanade en 2021 puis Microsoft en 2021 pour y assurer le poste de CE DATA / AI, autour des technologies Microsoft SQL Server, Power BI et Azure Data.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.