根据 API 端点的推断字段类型自动创建 SnowFlake table 的方法? (Python)
Way to automatically create SnowFlake table based on inferred field types from API Endpoint? (Python)
假设我有一个数据框,其中有一行:
{'ID':'123245','Comment':'This is my longer comment','Tax':1.07,'Units':2.0}
在 Python 中有没有办法做类似的事情:
max([len(str(i)) for i in set(df['Comments'])])
并推断最大 varchar 和其他元数据,然后我可以构建一个 SQL 查询来创建那个 table(在我的例子中,对于 SnowFlake)?
因为它需要未提及的额外逻辑(例如尝试转换为 int、float、datetime 等),也许这在现有库中很常见。
现在,我需要一些时间让每个端点手动检查字段并推断如何再次手动在 Snowflake 中制作每个 table。想自动化这个过程。
当然,在没有像库这样更复杂的东西的情况下实现自动化的一个方面是你现在的最大字段(例如 199 个字符长的评论)可能很快就会被未来输入这些字段的内容所违反,如果不是的话,比如说,四舍五入到一个 'max' varchar,例如当它不能转换为 float/int/date/etc.
时告诉这样的算法一个最小的 varchar
首先,如 Snowflake docs 中所述,显式设置 VARCHAR
列的最大长度对性能和存储没有影响,所以不要为此烦恼。
关于您的一般问题,您可以使用他们的原生 Python connector 将 DataFrame 简单地上传到您的环境。将 Python 类型与 Snowflake 类型匹配是自动完成的。
如果您只想创建 table 而不插入数据,请上传 df.iloc[:0]
。而如果你想获得create table
SQL,你可以使用get_ddl
。下面是一个示例实现。
import pandas as pd
import snowflake.connector
from snowflake.connector.pandas_tools import pd_writer
from snowflake.sqlalchemy import URL
import sqlalchemy
credentials = {**your_snowflake_credentials}
# Create example DataFrame
data = {
"ID": "123245",
"COMMENT": "This is my longer comment",
"TAX": 1.07,
"UNITS": 2,
}
df = pd.DataFrame([data])
# Upload empty DataFrame
df.iloc[:0].to_sql(
"test_table",
sqlalchemy.create_engine(URL(**credentials)),
index=False,
method=pd_writer,
)
# Retrieve the CREATE TABLE statement and drop the temporary table
# (if you really want to)
sql = "select get_ddl('table', 'test_table')"
with snowflake.connector.connect(**credentials) as connection:
with connection.cursor() as cursor:
create_table_sql = cursor.execute(sql).fetchone()[0]
cursor.execute("drop table test_table")
print(create_table_sql)
输出:
CREATE OR REPLACE TABLE TEST_TABLE (
ID VARCHAR(16777216),
COMMENT VARCHAR(16777216),
TAX FLOAT,
UNITS NUMBER(38,0)
);
假设我有一个数据框,其中有一行:
{'ID':'123245','Comment':'This is my longer comment','Tax':1.07,'Units':2.0}
在 Python 中有没有办法做类似的事情:
max([len(str(i)) for i in set(df['Comments'])])
并推断最大 varchar 和其他元数据,然后我可以构建一个 SQL 查询来创建那个 table(在我的例子中,对于 SnowFlake)?
因为它需要未提及的额外逻辑(例如尝试转换为 int、float、datetime 等),也许这在现有库中很常见。
现在,我需要一些时间让每个端点手动检查字段并推断如何再次手动在 Snowflake 中制作每个 table。想自动化这个过程。
当然,在没有像库这样更复杂的东西的情况下实现自动化的一个方面是你现在的最大字段(例如 199 个字符长的评论)可能很快就会被未来输入这些字段的内容所违反,如果不是的话,比如说,四舍五入到一个 'max' varchar,例如当它不能转换为 float/int/date/etc.
时告诉这样的算法一个最小的 varchar首先,如 Snowflake docs 中所述,显式设置 VARCHAR
列的最大长度对性能和存储没有影响,所以不要为此烦恼。
关于您的一般问题,您可以使用他们的原生 Python connector 将 DataFrame 简单地上传到您的环境。将 Python 类型与 Snowflake 类型匹配是自动完成的。
如果您只想创建 table 而不插入数据,请上传 df.iloc[:0]
。而如果你想获得create table
SQL,你可以使用get_ddl
。下面是一个示例实现。
import pandas as pd
import snowflake.connector
from snowflake.connector.pandas_tools import pd_writer
from snowflake.sqlalchemy import URL
import sqlalchemy
credentials = {**your_snowflake_credentials}
# Create example DataFrame
data = {
"ID": "123245",
"COMMENT": "This is my longer comment",
"TAX": 1.07,
"UNITS": 2,
}
df = pd.DataFrame([data])
# Upload empty DataFrame
df.iloc[:0].to_sql(
"test_table",
sqlalchemy.create_engine(URL(**credentials)),
index=False,
method=pd_writer,
)
# Retrieve the CREATE TABLE statement and drop the temporary table
# (if you really want to)
sql = "select get_ddl('table', 'test_table')"
with snowflake.connector.connect(**credentials) as connection:
with connection.cursor() as cursor:
create_table_sql = cursor.execute(sql).fetchone()[0]
cursor.execute("drop table test_table")
print(create_table_sql)
输出:
CREATE OR REPLACE TABLE TEST_TABLE (
ID VARCHAR(16777216),
COMMENT VARCHAR(16777216),
TAX FLOAT,
UNITS NUMBER(38,0)
);