【问题标题】:Specify columns while appending Snowpark Python Dataframe to table在将 Snowpark Python 数据框附加到表时指定列
【发布时间】:2022-11-11 15:07:14
【问题描述】:

所以现在,我有一个使用 Python 中的 session.createDataFrame() 创建的数据框。目的是将此 Dataframe 附加到 Snowflake 中的现有表对象。

但是,源数据框的架构与目标表的架构不完全匹配。在 Snowpark Scala 中,DataFrameWriter 对象具有 option() Saving/Appending Dataframe to a table 方法,该方法允许指定列顺序,因此允许从数据框中跳过列,因为列可以通过它们的名称匹配。

但是,Snowpark Python 目前缺少用于 DataframeWriter 的 option()。这会强制 Snowflake 查找模式和列数(在 source 和 target 之间)以匹配,否则会引发错误。

不确定 Snowpark for Python 何时会收到此功能,但在此期间,是否有任何替代方法(除了在 INSERT 查询中硬编码列名称)?

【问题讨论】:

    标签: snowflake-cloud-data-platform snowpark


    【解决方案1】:

    你说得对,Snowpark 并不容易插入新的记录。但这是可能的。我使用 Snowpark Java SDK 完成了它,它缺少任何源代码/文档,只是将我的头撞在桌子上直到它起作用。

    我首先对目标表进行了选择(见第一行),然后得到了模式,然后创建了一个具有正确顺序和类型的新 Row 对象。使用列“顺序”模式而不是列“名称”模式。它对类型也很挑剔——不喜欢 java.util.Dates 但想要时间戳,不喜欢整数但需要 Long 等。

    然后执行“追加”->“saveAsTable”。奇迹般地它奏效了。同意,如果他们接受 Map<String, Object> 来插入一行或让您使用名称映射列,那就太好了。但考虑到基于行的操作的仓库性能的性质,他们可能希望阻止这种做法。

    在爪哇...

    DataFrame dfSchema = session.sql("select * from TARGET_TABLE limit 1");
    StructType schema = dfSchema.schema();
    System.out.println(schema);
    Row[] rows = new Row[]{Row.fromArray(new Object[]{endpoint.getDatabaseTable(), statusesArr, numRecords, Integer.valueOf(filenames.size()).longValue(), filenamesArr, urlsArr, startDate, endDate})};
    DataFrame df = session.createDataFrame(rows, schema);
    System.out.println(df.showString(0, 120));
    df.write().mode("Append").saveAsTable("TARGET_TABLE"); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 2016-08-14
      • 2017-03-22
      • 2019-10-12
      • 1970-01-01
      相关资源
      最近更新 更多