Невозможно сохранить таблицу в хранилище метаданных улья, HDP 3.0

Я больше не могу сохранять таблицу в базу данных куста с помощью хранилища метаданных. Я вижу таблицы в искре с использованием spark.sql, но я не вижу тех же таблиц в базе данных улья. Я пробовал это, но он не хранит таблицу в улье. Как я могу настроить хранилище метаданных улья? Версия 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 используют независимые каталоги

Сохранить таблицу в каталог Spark:

df.createOrReplaceTempView("my_temp_table");
spark.sql("create table my_table as select * from my_temp_table");

VS

Сохранить таблицу в каталог ульев:

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?


person Community    schedule 15.11.2018    source источник


Ответы (2)


Как сказал @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()
}
person Community    schedule 21.11.2018

Из документов Hortonworks: В HDP 3.0 и более поздних версиях Spark и Hive используют независимые каталоги для доступа к таблицам SparkSQL или Hive на одной или разных платформах. Таблица, созданная Spark, находится в каталоге Spark. Таблица, созданная Hive, находится в каталоге Hive. Базы данных подпадают под пространство имен каталога, аналогично тому, как таблицы принадлежат пространству имен базы данных. Несмотря на независимость, эти таблицы взаимодействуют друг с другом, и вы можете видеть таблицы Spark в каталоге Hive, но только при использовании коннектора Hive Warehouse Connector.

Используйте операции записи из API HWC для записи DataFrame в Hive.

Обновление: теперь вы можете (с помощью HDP 3.1) создать DataFrame, и если таблица Hive, представляющая DataFrame, не существует, коннектор хранилища Hive создает ее, как показано в документы HDP 3.1:

df = //Create DataFrame from any source

val hive = com.hortonworks.spark.sql.hive.llap.HiveWarehouseBuilder.session(spark).build()

df.write.format(HIVE_WAREHOUSE_CONNECTOR)
.option("table", "my_Table")
.save()
person catpaws    schedule 15.11.2018
comment
Да, но Hive Warehouse Connector непрактичен для хранения больших фреймов данных. Обновил вопрос. - person ; 16.11.2018