仅使用 REST 和 SQL 命令批量插入雪花

时间:2021-02-12 16:48:21

标签: snowflake-cloud-data-platform

我使用的是 Snowflake 数据库和 HiQ FRENDS 集成平台。没有(据我所知)FRENDS 的雪花插件。我在运行 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 命令)的方法?

1 个答案:

答案 0 :(得分:1)

Snowflake ODBC 驱动程序支持 PUT 命令将文件上传到内部阶段 https://docs.snowflake.com/en/sql-reference/sql/put.html#put

您可以在此处获取 ODBC 驱动程序https://sfc-repo.snowflakecomputing.com/odbc/index.html

然后,您可以使用标准方法通过 ODBC 驱动程序像使用任何其他 SQL 命令一样使用 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}\t{1}\t{2}\t{3}", 
                        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();
    }
}

}

相关问题