J'ai une table externe sur le bucket gs et pour faire une logique de compactage, je veux déterminer le chemin complet sur lequel la table est créée.
val tableName="stock_ticks_cow_part" val primaryKey="key" val versionPartition="version" val datePartition="dt" val datePartitionCol=new org.apache.spark.sql.ColumnName(datePartition) import spark.implicits._ val compactionTable = spark.table(tableName).withColumnRenamed(versionPartition, "compaction_version").withColumnRenamed(datePartition, "date_key") compactionTable. <code for determining the path>
Faites-moi savoir si quelqu'un sait comment déterminer le chemin de la table dans scala.
4 Réponses :
Je pense que vous pouvez utiliser .inputFiles
à
Renvoie un instantané au mieux des fichiers qui composent cet ensemble de données
Sachez que cela renvoie un Array [String]
, vous devriez donc le parcourir pour obtenir toutes les informations que vous recherchez.
Donc en fait il suffit d'appeler
compactionTable.inputFiles
et de regarder chaque élément du tableau
Vous pouvez utiliser les commandes SQL SHOW CREATE TABLE
ou DESCRIBE FORMATTED
. Les deux doivent renvoyer le location
de la table externe, mais ils ont besoin d'une logique pour extraire ce chemin ...
Voir aussi Comment obtenir la valeur de l'emplacement d'une table Hive à l'aide d'un objet Spark?
Voici la bonne réponse:
import org.apache.spark.sql.catalyst.TableIdentifier lazy val tblMetadata = catalog.getTableMetadata(new TableIdentifier(tableName,Some(schema))) lazy val s3location: String = tblMetadata.location.getPath
Utilisez la commande SQL DESCRIBE FORMATTED
et récupérez le chemin vers le pilote.
Dans Scala:
location = spark.sql("DESCRIBE FORMATTED table_name").filter("col_name = 'Location'").select("data_type").head()[0]
La même chose en Python :
val location = spark.sql("DESCRIBE FORMATTED table_name").filter("col_name = 'Location'").select("data_type").head().getString(0)