Не могу сохранить стол в улей metastore, HDP 3.0
Я больше не могу сохранить таблицу в базе данных улья, используя metastore. Я вижу таблицы в спарк, используя spark.sql
но я не могу увидеть те же таблицы в базе данных улья. Я пробовал это, но он не хранит таблицу для улья. Как я могу настроить улей metastore? Версия Spark 2.3.1.
Если вы хотите больше деталей, пожалуйста, прокомментируйте.
%spark
import org.apache.spark.sql.SparkSession
val spark = (SparkSession
.builder
.appName("interfacing spark sql to hive metastore without configuration file")
.config("hive.metastore.uris", "thrift://xxxxxx.xxx:9083") // replace with your hivemetastore service's thrift url
.enableHiveSupport() // don't forget to enable hive support
.getOrCreate())
spark.conf.get("spark.sql.warehouse.dir")// Output: res2: String = /apps/spark/warehouse
spark.conf.get("hive.metastore.warehouse.dir")// NotSuchElement Exception
spark.conf.get("spark.hadoop.hive.metastore.uris")// NotSuchElement Exception
var df = (spark
.read
.format("parquet")
.load(dataPath)
df.createOrReplaceTempView("my_temp_table");
spark.sql("drop table if exists my_table");
spark.sql("create table my_table using hive as select * from my_temp_table");
spark.sql("show tables").show(false)// I see my_table in default database
Обновление после ответа @catpaws: HDP 3.0 и более поздние версии, Hive и Spark используют независимые каталоги
Сохранить таблицу в каталоге свечей:
df.createOrReplaceTempView("my_temp_table");
spark.sql("create table my_table as select * from my_temp_table");
В.С.
Сохранить таблицу в каталоге улья:
val hive = com.hortonworks.spark.sql.hive.llap.HiveWarehouseBuilder.session(spark).build()
hive.createTable("newTable")
.ifNotExists()
.column("ws_sold_time_sk", "bigint")
...// x 200 columns
.column("ws_ship_date_sk", "bigint")
.create()
df.write.format(HIVE_WAREHOUSE_CONNECTOR)
.option("table", "newTable")
.save()
Как вы видите, Hive Warehouse Connector очень непрактичен для фреймов данных с сотнями столбцов. Есть ли способ сохранить большие данные в Hive?
2 ответа
Из документов Hortonworks. В HDP 3.0 и более поздних версиях Spark и Hive используют независимые каталоги для доступа к таблицам SparkSQL или Hive на одной или разных платформах. Таблица, созданная Spark, находится в каталоге Spark. Таблица, созданная Hive, находится в каталоге Hive. Базы данных попадают в пространство имен каталога, подобно тому, как таблицы принадлежат пространству имен базы данных. Несмотря на независимость, эти таблицы взаимодействуют, и вы можете увидеть таблицы Spark в каталоге Hive, но только при использовании Hive Warehouse Connector.
Используйте операции записи API HWC для записи DataFrame в Hive.
Как сказал @catpaws, Spark и Hive используют независимые каталоги. Чтобы сохранить фрейм данных с несколькими столбцами с помощью Hive Warehouse Connector, вы можете использовать мою функцию:
save_table_hwc(df1, "default", "table_test1")
def save_table_hwc(df: DataFrame, database: String, tableName: String) : Unit = {
hive.setDatabase(database)
hive.dropTable(tableName, true, false)
hive.createTable(tableName)
var table_builder = hive.createTable(tableName)
for( i <- 0 to df.schema.length-1){
var name = df.schema.toList(i).name.replaceAll("[^\\p{L}\\p{Nd}]+", "")
var data_type = df.schema.toList(i).dataType.sql
table_builder = table_builder.column(name, data_type)
}
table_builder.create()
df.write.format(HIVE_WAREHOUSE_CONNECTOR).option("table", tableName).save()
}