我们可以不使用Python使用Snowflake内部阶段将数据直接写入雪花表吗?
似乎是辅助任务,首先在阶段中编写然后进行转换,然后将其加载到表中。只能像在RDBMS中进行JDBC连接一样一步完成。
答案 0 :(得分:3)
将数据加载到Snowflake的绝对最快的方法是来自内部或外部舞台上的文件。期。所有连接器都可以使用标准插入命令插入数据,但是效果不佳。也就是说,许多Snowflake驱动程序现在都在透明地使用PUT / COPY命令通过内部平台将大数据加载到Snowflake。如果您要这样做,则可以使用pandas write_pandas
命令在单个命令中将数据从pandas数据帧加载到Snowflake。在幕后,它将为您执行PUT和COPY INTO。
我强烈建议在任何驱动程序中的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中的最快方法是来自文件