См. документы
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.