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

Я хочу создать управляемую таблицу с расположением на AWS S3 через spark sql, но если я укажу расположение, она создаст ВНЕШНЮЮ таблицу, даже если я не укажу это ключевое слово.

CREATE TABLE IF NOT EXISTS database.tableOnS3(name string)
LOCATION 's3://mybucket/';

Почему ониздесь подразумевается ключевое слово EXTERNAL ...

Если я выполню этот запрос в консоли куста, он создаст управляемую таблицу, так как же сделать это в spark?

1 Ответ

1 голос
/ 06 июня 2019

См. документы Hive в основном знает два разных типа таблиц:

Управляемый (Внутренний)
Внешний


Управляемые таблицы: Управляемая таблица хранится в свойство пути hive.metastore.warehouse.dir, по умолчанию в папке путь похож на /user/hive/warehouse/databasename.db/tablename/. местоположение по умолчанию может быть переопределено свойством location во время создание таблицы. Если управляемая таблица или раздел отброшены, данные и метаданные, связанные с этой таблицей или разделом, удаляются. Если опция PURGE не указана, данные перемещаются в корзину на определенный срок.

Используйте управляемые таблицы, когда Hive должен управлять жизненным циклом таблицы, или при создании временных таблиц.

Внешние таблицы: Внешняя таблица описывает метаданные / схему на внешние файлы. Внешние файлы таблиц могут быть доступны и управляться процессы за пределами улья. Внешние таблицы могут получить доступ к данным, хранящимся в такие источники, как тома хранилища Azure (ASV) или удаленные расположения HDFS. Если структура или разбиение внешней таблицы изменяется, MSCK REPAIR TABLE оператор table_name может использоваться для обновления метаданных информация.

Использовать внешние таблицы, когда файлы уже присутствуют или находятся на удаленном местоположения, и файлы должны оставаться, даже если таблица отброшена.

Вывод:


, так как вы используете внешнее местоположение s3, оно показывает вот так.

Далее вы хотите понять, как работает код, см. CreateTableLikeCommand: здесь val tblType = if (location.isEmpty) CatalogTableType.MANAGED else CatalogTableType.EXTERNAL - то, где он динамически принимает решение ...

/**
 * A command to create a table with the same definition of the given existing table.
 * In the target table definition, the table comment is always empty but the column comments
 * are identical to the ones defined in the source table.
 *
 * The CatalogTable attributes copied from the source table are storage(inputFormat, outputFormat,
 * serde, compressed, properties), schema, provider, partitionColumnNames, bucketSpec.
 *
 * The syntax of using this command in SQL is:
 * {{{
 *   CREATE TABLE [IF NOT EXISTS] [db_name.]table_name
 *   LIKE [other_db_name.]existing_table_name [locationSpec]
 * }}}
 */
case class CreateTableLikeCommand(
    targetTable: TableIdentifier,
    sourceTable: TableIdentifier,
    location: Option[String],
    ifNotExists: Boolean) extends RunnableCommand {

  override def run(sparkSession: SparkSession): Seq[Row] = {
    val catalog = sparkSession.sessionState.catalog
    val sourceTableDesc = catalog.getTempViewOrPermanentTableMetadata(sourceTable)

    val newProvider = if (sourceTableDesc.tableType == CatalogTableType.VIEW) {
      Some(sparkSession.sessionState.conf.defaultDataSourceName)
    } else {
      sourceTableDesc.provider
    }

    // If the location is specified, we create an external table internally.
    // Otherwise create a managed table.
    val tblType = if (location.isEmpty) CatalogTableType.MANAGED else CatalogTableType.EXTERNAL

    val newTableDesc =
      CatalogTable(
        identifier = targetTable,
        tableType = tblType,
        storage = sourceTableDesc.storage.copy(
          locationUri = location.map(CatalogUtils.stringToURI(_))),
        schema = sourceTableDesc.schema,
        provider = newProvider,
        partitionColumnNames = sourceTableDesc.partitionColumnNames,
        bucketSpec = sourceTableDesc.bucketSpec)

    catalog.createTable(newTableDesc, ifNotExists)
    Seq.empty[Row]
  }
}

Обновление: Если я выполню этот запрос в консоли куста, он создаст управляемую таблицу, так как сделать то же самое в spark?

надеюсь, что вы используете то же локальное местоположение (не отличающееся от vpc), где сосуществуют улей и искра. если так, то установите

spark.sql.warehouse.dir = hdfs: /// ... в папку s3

с помощью spark conf .... вам может понадобиться установить ключ доступа и секретные идентификаторы id для объекта конфигурации spark для создания сеанса spark.


...