Поделиться через


Чтение и запись данных из Snowflake

Azure Databricks предоставляет соединитель Snowflake в среде выполнения Databricks для поддержки чтения и записи данных из Snowflake.

Внимание

Конфигурации, описанные в этой статье, являются экспериментальными. Экспериментальные функции предоставляются как есть и не поддерживаются Databricks через техническую поддержку клиентов. Чтобы получить полную поддержку федерации запросов, следует вместо этого использовать федерацию Lakehouse, которая позволяет пользователям Azure Databricks воспользоваться синтаксисом каталога Unity и средствами управления данными.

Запрос таблицы Snowflake в Azure Databricks

Вы можете настроить подключение к Snowflake, а затем запросить данные. Перед началом работы проверьте, какая версия Databricks Runtime работает в кластере. Следующий код содержит пример синтаксиса в Python, SQL и Scala.

Python


# The following example applies to Databricks Runtime 11.3 LTS and above.

snowflake_table = (spark.read
  .format("snowflake")
  .option("host", "hostname")
  .option("port", "port") # Optional - will use default port 443 if not specified.
  .option("user", "username")
  .option("password", "password")
  .option("sfWarehouse", "warehouse_name")
  .option("database", "database_name")
  .option("schema", "schema_name") # Optional - will use default schema "public" if not specified.
  .option("dbtable", "table_name")
  .load()
)

# The following example applies to Databricks Runtime 10.4 and below.

snowflake_table = (spark.read
  .format("snowflake")
  .option("dbtable", table_name)
  .option("sfUrl", database_host_url)
  .option("sfUser", username)
  .option("sfPassword", password)
  .option("sfDatabase", database_name)
  .option("sfSchema", schema_name)
  .option("sfWarehouse", warehouse_name)
  .load()
)

SQL


/* The following example applies to Databricks Runtime 11.3 LTS and above. */

DROP TABLE IF EXISTS snowflake_table;
CREATE TABLE snowflake_table
USING snowflake
OPTIONS (
    host '<hostname>',
    port '<port>', /* Optional - will use default port 443 if not specified. */
    user '<username>',
    password '<password>',
    sfWarehouse '<warehouse_name>',
    database '<database-name>',
    schema '<schema-name>', /* Optional - will use default schema "public" if not specified. */
    dbtable '<table-name>'
);
SELECT * FROM snowflake_table;

/* The following example applies to Databricks Runtime 10.4 LTS and below. */

DROP TABLE IF EXISTS snowflake_table;
CREATE TABLE snowflake_table
USING snowflake
OPTIONS (
    dbtable '<table-name>',
    sfUrl '<database-host-url>',
    sfUser '<username>',
    sfPassword '<password>',
    sfDatabase '<database-name>',
    sfSchema '<schema-name>',
    sfWarehouse '<warehouse-name>'
);
SELECT * FROM snowflake_table;

Scala


# The following example applies to Databricks Runtime 11.3 LTS and above.

val snowflake_table = spark.read
  .format("snowflake")
  .option("host", "hostname")
  .option("port", "port") /* Optional - will use default port 443 if not specified. */
  .option("user", "username")
  .option("password", "password")
  .option("sfWarehouse", "warehouse_name")
  .option("database", "database_name")
  .option("schema", "schema_name") /* Optional - will use default schema "public" if not specified. */
  .option("dbtable", "table_name")
  .load()

# The following example applies to Databricks Runtime 10.4 and below.

val snowflake_table = spark.read
  .format("snowflake")
  .option("dbtable", table_name)
  .option("sfUrl", database_host_url)
  .option("sfUser", username)
  .option("sfPassword", password)
  .option("sfDatabase", database_name)
  .option("sfSchema", schema_name)
  .option("sfWarehouse", warehouse_name)
  .load()

Пример записной книжки: Соединитель Snowflake для Spark

В следующих записных книжках содержатся простые примеры записи и чтения данных в Snowflake. Дополнительные сведения см. в соединителе Snowflake для Spark .

Совет

Старайтесь не указывать в записных книжках имя пользователя и пароль Snowflake. Для этого используйте секреты, которые в них демонстрируются.

Записная книжка Python для Snowflake

Получить записную книжку

Пример записной книжки: сохранение результатов обучения модели в Snowflake

В следующей записной книжке приведены рекомендации по использованию соединителя Snowflake для Spark. Он записывает данные в Snowflake, использует Snowflake для некоторой базовой обработки данных, обучает модель машинного обучения в Azure Databricks и записывает результаты обратно в Snowflake.

Хранение результатов машинного обучения в записной книжке Snowflake

Получить записную книжку

Вопросы и ответы

Почему столбцы Spark DataFrame отображаются в том же порядке в Snowflake?

Соединитель Snowflake для Spark не учитывает порядок столбцов в таблице, в которую производится запись. Необходимо явно указать сопоставление между столбцами DataFrame и Snowflake. Чтобы указать это сопоставление, используйте параметр columnmap.

Почему данные записываются INTEGER обратно в Snowflake DECIMAL?

Snowflake представляет все типы INTEGER как NUMBER, что может привести к изменению типа данных при их записи и чтении в Snowflake. Например, данные INTEGER могут быть преобразованы в DECIMAL при записи в Snowflake, поскольку типы INTEGER и DECIMAL в Snowflake семантически эквивалентны (см. статью Числовые типы данных в Snowflake).

Почему поля в схеме таблицы Snowflake всегда записываются прописными буквами?

По умолчанию Snowflake использует поля в верхнем регистре, что означает, что схема таблицы преобразуется в верхний регистр.