python - 基于从 API 端点推断的字段类型自动创建 SnowFlake 表的方法? (Python)

标签 python sqlalchemy snowflake-cloud-data-platform endpoint snowflake-schema

假设我有一个数据框,其中有一行:

{'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 查询来创建该表(在我的例子中,用于 SnowFlake)?

由于它会采用未提及的其他逻辑(例如,尝试转换为 int、float、datetime 等),也许这在现有库中很常见。

现在,我需要一些时间让每个端点手动检查各个字段并再次手动推断如何在 Snowflake 中制作每个表。想要自动化这个过程。

当然,在没有像库这样更复杂的东西的情况下自动化这个的一个方面是你现在的最大字段(例如 199 个字符长的评论)可能很快就会被 future 输入这些字段的违反,如果不是,比如说,舍入为“最大”varchar,例如在无法转换为 float/int/date/etc 时告诉此类算法最小 varchar。

最佳答案

首先,如 Snowflake docs 中所述, 显式设置 VARCHAR 列的最大长度对性能和存储没有影响,所以不要为此烦恼。

关于你的一般问题,你可以用他们的原生Python connector只需将 DataFrame 上传到您的环境。将 Python 类型与 Snowflake 类型匹配是自动完成的。

如果只想创建表而不插入数据,请上传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)
);

关于python - 基于从 API 端点推断的字段类型自动创建 SnowFlake 表的方法? (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65411486/

相关文章:

python - 如何为python定义文件模板?

python - Timus 1005 的 Python 解决方案的可能优化 - 平衡分区

python - fill_between with matplotlib 和两个列表的 where 条件

python - 如何从 sqlalchemy 中的 session.add() 获取原始 sql?

python - 在 SQLAlchemy 中, "filter"与 "join and filter"语法有什么区别?

python - 如何将 SQLAlchemy 行对象转换为 Python 字典?

sql - dateadd函数雪花中的变量

sql - 授予选择 future View 雪花

python - 在 Python 中使用 ElementTree 解析 XML

sql - 条件排名