【问题标题】: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");