使用Python将数据写入雪花

时间:2020-08-27 12:50:19

标签: python-3.x snowflake-cloud-data-platform

我们可以不使用Python使用Snowflake内部阶段将数据直接写入雪花表吗?

似乎是辅助任务,首先在阶段中编写然后进行转换,然后将其加载到表中。只能像在RDBMS中进行JDBC连接一样一步完成。

3 个答案:

答案 0 :(得分:3)

将数据加载到Snowflake的绝对最快的方法是来自内部或外部舞​​台上的文件。期。所有连接器都可以使用标准插入命令插入数据,但是效果不佳。也就是说,许多Snowflake驱动程序现在都在透明地使用PUT / COPY命令通过内部平台将大数据加载到Snowflake。如果您要这样做,则可以使用pandas write_pandas命令在单个命令中将数据从pandas数据帧加载到Snowflake。在幕后,它将为您执行PUT和COPY INTO。

https://docs.snowflake.com/en/user-guide/python-connector-api.html#label-python-connector-api-write-pandas

我强烈建议在任何驱动程序中的INSERT命令上使用此模式。而且我还建议在加载到Snowflake之后而不是之前完成转换。

答案 1 :(得分:1)

如果有人在处理大型数据集时遇到问题。尝试使用 dask 并在分区后将数据帧生成为 CSV 块。然后您可以将 dask.delayed 与多线程的 PUT 操作一起使用,然后最后使用 COPY 命令。对于大型 CSV 文件,您的连接可能会超时。最好分块进行。

import dask.dataframe as dd
df = dd.read_csv('YOUR Large CSV')
df = df.partion(npartions=100)
df.to_csv('folder_name/export_*.csv')#files will be based on number of partions
import glob
lst_files = glob.glob('folder_name/*csv')
#your sqlalchemy engine or snowflake conn object
@dask.delayed
def run_put_query(conxn):
    conxn.execute(
        f"PUT file://{csv_file} @{staging_area_path}/{folder_name} overwrite=true")
    return
delayed_objects = []

for csv_file in lst_files:
    res = run_put_query(
        conxn=conxn
    )
    delayed_objects.append(res)
output = dask.compute(*delayed_objects,scheduler='threads',num_workers=10)

答案 2 :(得分:0)

Java:

加载驱动程序类:

Class.forName(“ net.snowflake.client.jdbc.SnowflakeDriver”)

Maven:

添加以下代码块作为依赖项

<dependency>
  <groupId>net.snowflake</groupId>
  <artifactId>snowflake-jdbc</artifactId>
  <version>{version}</version>

春季:

application.yml:

    spring:
      datasource
        hikari:
          maximumPoolSize: 4 # Specify maximum pool size
          minimumIdle: 1 # Specify minimum pool size
          driver-class-name: com.snowflake.client.jdbc.SnowflakeDriver

Python:

    import pyodbc

    # pyodbc connection string
    conn = pyodbc.connect("Driver={SnowflakeDSIIDriver}; Server=XXX.us-east-2.snowflakecomputing.com; Database=VAQUARKHAN_DB; schema=public; UID=username; PWD=password")

    #  Cursor
    cus=conn.cursor()

    # Execute SQL statement to get current datetime and store result in cursor
    cus.execute("select current_date;")

    # Display the content of cursor
    row = cus.fetchone()

    print(row)

Apache Spark:

    <dependency>
         <groupId>net.snowflake</groupId>
         <artifactId>spark-snowflake_2.11</artifactId>
         <version>2.5.9-spark_2.4</version>
    </dependency>

代码

   import org.apache.spark.sql.DataFrame
   import org.apache.spark.sql.DataFrame


        / Use secrets DBUtil to get Snowflake credentials.
        val user = dbutils.secrets.get("data-warehouse", "<snowflake-user>")
        val password = dbutils.secrets.get("data-warehouse", "<snowflake-password>")

        val options = Map(
          "sfUrl" -> "<snowflake-url>",
          "sfUser" -> user,
          "sfPassword" -> password,
          "sfDatabase" -> "<snowflake-database>",
          "sfSchema" -> "<snowflake-schema>",
          "sfWarehouse" -> "<snowflake-cluster>"
        )


        // Generate a simple dataset containing five values and write the dataset to Snowflake.
        spark.range(5).write
          .format("snowflake")
          .options(options)
          .option("dbtable", "<snowflake-database>")
          .save()


        // Read the data written by the previous cell back.
        val df: DataFrame = spark.read
          .format("snowflake")
          .options(options)
          .option("dbtable", "<snowflake-database>")
          .load()

        display(df)

将数据加载到Snowflake中的最快方法是来自文件