仅使用 REST 和 SQL 命令批量插入到 Snowflake
Posted
技术标签:
【中文标题】仅使用 REST 和 SQL 命令批量插入到 Snowflake【英文标题】:Bulk insert to Snowflake using only REST and SQL commands 【发布时间】:2021-02-12 16:48:21 【问题描述】:我正在使用 Snowflake 数据库和 HiQ FRENDS 集成平台。 FRENDS 没有(据我所知)Snowflake 插件。我在运行 Frends 服务器的 Windows 平台上安装了 sbnowflake ODBC 驱动程序。
我正在寻找一种将 FRENDS 批量上传到 Snowflake 的方法。我知道我应该将我的数据文件上传到 Snowflake 中的舞台区域,然后使用 COPY 命令将其附加到 DB。但是我还没有找到通过 REST API(或任何其他方法)将我的数据上传到舞台的方法。我发现的与该主题相关的唯一文档是 Snowpipes (https://docs.snowflake.com/en/user-guide/data-load-snowpipe-rest-apis.html),但我不想在我的流程中使用管道。我知道这是可能的,因为某些软件,例如 Alteryx 可以在目标数据库中没有管道的情况下进行批量上传。
有没有人想办法将结构化的 JSON/CSV 数据上传到 Snowflake 以进行批量插入,而无需调用外部二进制文件,例如 put
命令?
【问题讨论】:
这是雪花还是朋友的问题?我找不到太多关于 FRENDS 的信息 Alteryx 正在使用 Snowflake ODBC 驱动程序或用于 Snowflake 的 Simba ODBC 驱动程序。批量加载文件的标准方法是使用 Python 连接器或 ODBC/JDBC 驱动程序,具体取决于首选平台和语言。Python 连接器和 ODBC/JDBC 驱动程序具有PUT
文件功能。 JDBC 驱动程序还有另一种文件上传方法。还有一个 .NET 驱动程序,但它目前没有 put 功能。
@FelipeHoffa:我想更多关于雪花的信息。如果我知道如何使用 Curl 上传文件,我就会知道如何使用 FRENDS 上传文件。可惜没有Frends的标签,它是一款不错的软件。一旦我获得足够的声望,我会添加它。
@GregPavlik 感谢您提供的信息。所以 ODBC 驱动程序具有我需要的所有功能,我不需要使用 API 单独上传文件。
是的,ODBC 驱动程序支持 PUT 命令将文件放到一个阶段。我将在 C# 中添加一个代码示例。
【参考方案1】:
Snowflake ODBC 驱动支持 PUT 命令上传文件到内部阶段https://docs.snowflake.com/en/sql-reference/sql/put.html#put
您可以在此处获取 ODBC 驱动程序https://sfc-repo.snowflakecomputing.com/odbc/index.html
然后,您可以像使用任何其他 SQL 命令一样通过 ODBC 驱动程序使用标准方法使用 PUT 命令。请注意,当 ODBC 放置失败时,ODBC 驱动程序提供的消息是通用的。您可以通过转到 Web UI 中的 Snowflake History 选项卡来获取更详细的信息,以获取更详细的错误消息。
static void Main(string[] args)
Console.WriteLine("Connecting to Snowflake...");
string connetionString = null;
OdbcConnection cnn;
connetionString = "Driver=SnowflakeDSIIDriver;Server=XXXXXXXXXXXXX.snowflakecomputing.com;Database=TEST;UID=greg;PWD=*******";
cnn = new OdbcConnection(connetionString);
try
cnn.Open();
Console.WriteLine("Connected.");
String putCmd = "put file://C:\\Users\\greg\\Desktop\\MyFile.csv @TEST.PUBLIC.MY_STAGE";
Console.WriteLine(putCmd);
OdbcCommand cmd = new OdbcCommand(putCmd, cnn);
OdbcDataReader rs = cmd.ExecuteReader();
if (rs.HasRows)
while (rs.Read())
Console.WriteLine("0\t1\t2\t3",
rs.GetString(0), rs.GetString(1), rs.GetString(2), rs.GetString(3));
else
Console.WriteLine("No rows found.");
rs.Close();
cnn.Close();
catch (Exception e)
Console.Write("Error: " + e.Message);
Console.ReadKey();
【讨论】:
感谢您的努力。我希望 Frends 提供工具和灵活性来使用 ODBC 命令,就像您在代码示例中使用它们一样。至少现在我有一些工作要做。以上是关于仅使用 REST 和 SQL 命令批量插入到 Snowflake的主要内容,如果未能解决你的问题,请参考以下文章
使用 Django REST 框架进行批量插入的最佳设计模式是啥?
使用foreach批量插入数据时报“SQL 命令未正确结束”