微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于 API 端点推断的字段类型自动创建雪花表的方法? Python

如何解决基于 API 端点推断的字段类型自动创建雪花表的方法? 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 查询来创建该表(在我的情况下,用于 SNowFlake)?

由于需要额外的未提及的逻辑(例如,尝试将其转换为 int、float、datetime 等),因此这可能在现有库中很常见。

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

当然,在没有像库这样更复杂的东西的情况下实现自动化的一个方面是,您现在的最大字段(例如长度为 199 个字符的评论)可能很快就会被未来对这些字段的输入所侵犯,例如,向上舍入为“最大”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)
);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。