Как получить значение местоположения для таблицы Hive, используя объект Spark? - PullRequest
0 голосов
/ 06 января 2019

Меня интересует возможность получения значения location таблицы Hive для объекта Spark (SparkSession). Один из способов получить это значение - проанализировать выходные данные о местоположении с помощью следующего SQL-запроса:

describe formatted <table name>

Мне было интересно, есть ли другой способ получить значение location без разбора выходных данных. API был бы хорош в случае, если вывод вышеуказанной команды меняется между версиями Hive. Если нужна внешняя зависимость, что бы это было? Есть ли пример кода искры, который может получить значение местоположения?

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Вот правильный ответ:

import org.apache.spark.sql.catalyst.TableIdentifier

lazy val tblMetadata = spark.sessionState.catalog.getTableMetadata(new TableIdentifier(tableName,Some(schema)))
0 голосов
/ 06 января 2019

Первый подход

Вы можете использовать input_file_name с фреймом данных.

это даст вам абсолютный путь к файлу детали.

spark.read.table("zen.intent_master").select(input_file_name).take(1)

А затем извлеките из него путь к таблице.

Второй подход

Это больше хака, можно сказать.

package org.apache.spark.sql.hive

import java.net.URI

import org.apache.spark.sql.catalyst.catalog.{InMemoryCatalog, SessionCatalog}
import org.apache.spark.sql.catalyst.parser.ParserInterface
import org.apache.spark.sql.internal.{SessionState, SharedState}
import org.apache.spark.sql.SparkSession

class TableDetail {
  def getTableLocation(table: String, spark: SparkSession): URI = {
    val sessionState: SessionState = spark.sessionState
    val sharedState: SharedState = spark.sharedState
    val catalog: SessionCatalog = sessionState.catalog
    val sqlParser: ParserInterface = sessionState.sqlParser
    val client = sharedState.externalCatalog match {
      case catalog: HiveExternalCatalog => catalog.client
      case _: InMemoryCatalog => throw new IllegalArgumentException("In Memory catalog doesn't " +
        "support hive client API")
    }

    val idtfr = sqlParser.parseTableIdentifier(table)

    require(catalog.tableExists(idtfr), new IllegalArgumentException(idtfr + " done not exists"))
    val rawTable = client.getTable(idtfr.database.getOrElse("default"), idtfr.table)
    rawTable.location
  }
}
...