Использование spark sql DataFrameWriter для создания внешней таблицы Hive

В рамках процесса интеграции данных, над которым я работаю, мне необходимо сохранить Spark SQL DataFrame в качестве внешней таблицы Hive.

Мои ограничения на данный момент:

  • В настоящее время ограничено Spark 1.6 (v1.6.0)
  • Необходимо сохранить данные в определенном месте, сохраняя данные, даже если определение таблицы удалено (отсюда внешняя таблица).

Я нашел удовлетворительное решение для записи кадра данных df следующим образом:

df.write.saveAsTable('schema.table_name',
    format='parquet',
    mode='overwrite',
    path='/path/to/external/table/files/')       

Выполнение describe extended schema.table_name для результирующей таблицы подтверждает, что она действительно является внешней. Я также могу подтвердить, что данные сохраняются (по желанию), даже если сама таблица удалена.

Меня больше всего беспокоит то, что я нигде не могу найти задокументированный пример этого, и я не могу найти много упоминаний об этом в официальных документах, особенно об использовании path для принудительного создания внешней таблицы. (https://spark.apache.org/docs/1.6.0/api/python/pyspark.sql.html#pyspark.sql.DataFrameWriter).

Есть ли лучший/безопасный/более стандартный способ сохранения фрейма данных?


person harrisniall    schedule 01.09.2017    source источник


Ответы (1)


Я предпочитаю сам создавать таблицы Hive (например, CREATE EXTERNAL TABLE IF NOT EXISTS) именно так, как мне нужно, а затем просто делаю в Spark: df.write.saveAsTable('schema.table_name', mode='overwrite').

Таким образом, вы контролируете создание таблицы и не зависите от того, что HiveContext делает то, что вам нужно. В прошлом возникали проблемы с таблицами Hive, созданными таким образом, и поведение может измениться в будущем, поскольку этот API является универсальным и не может гарантировать базовую реализацию HiveContext.

person Gonzalo Herreros    schedule 01.09.2017
comment
Спасибо за ваш ответ Гонсало. Чтобы было ясно, вы рекомендуете мне использовать оператор Hive create, чтобы специально создать таблицу в нужном месте, а затем оставить создание схемы команде saveAsTable? Или включить как можно больше определения таблицы в оператор Hive? - person harrisniall; 04.09.2017
comment
Я всегда делаю полное определение таблицы в CREATE, и я ожидаю (но не пробовал), что параметры сохранения будут игнорироваться, если таблица уже существует - person Gonzalo Herreros; 04.09.2017