gpt4 book ai didi

python - 将 Pandas 中的 VARIANT 类型插入 Snowflake

转载 作者:行者123 更新时间:2023-12-03 23:42:51 25 4
gpt4 key购买 nike

我正在尝试将 Pandas 数据帧中的数据插入 Snowflake 中的表中,但我无法弄清楚如何正确执行此操作。首先,我在 Snowflake 中创建了一个表,其中包含一些类型为 VARIANT 的列。 .例如:

CREATE OR REPLACE TABLE
mydatabase.myschema.results(
DATE date,
PRODUCT string,
PRODUCT_DETAILS variant,
ANALYSIS_META variant,
PRICE float
)
然后在 Pandas 中,我有一个这样的数据框:
import pandas as pd
record = {'DATE': '2020-11-05',
'PRODUCT': 'blue_banana',
'PRODUCT_DETAILS': "{'is_blue': True, 'is_kiwi': nan}",
'ANALYSIS_META': "None",
'PRICE': 13.02}
df = pd.DataFrame(record, index=[0])
如您所见,我已经对 VARIANT 进行了编码列作为字符串,因为这是我从 snowflake-connector documentation 中理解的,那一片雪花 VARIANT类型映射到 str Pandas 中的 dtype,反之亦然。
所以,我所尝试的是以下内容:
from snowflake.connector import pandas_tools

pandas_tools.write_pandas(
conn=conn,
df=df,
table_name="results",
schema="myschema",
database="mydatabase")
这确实有效,返回
(True,
1,
1,
[('czeau/file0.txt', 'LOADED', 1, 1, 1, 0, None, None, None, None)])
但是,我在 Snowflake 中得到的结果不正确 VARIANT类型。领域 ANALYSIS_META是正确的 NULL , 但字段 PRODUCT_DETAILS类型为 str .看:
enter image description here
(此外,例如此查询会引发错误:
SELECT * FROM
MYDATABASE.MYSCHEMA.RESULTS
WHERE PRODUCT_DETAILS:is_blue -- should work for json/variant fields
综上所述,我的问题是:我应该如何正确格式化我的 Pandas 数据框以插入他 VARIANT字段正确作为嵌套字段放入雪花表中?我认为将字典转换为字符串可以解决问题,但显然它不像我预期的那样工作。我在这里缺少什么?

最佳答案

经过一番调查,我找到了以下解决方案:
1. 确保列符合 json 规范
这里的关键是json.dumps将您的数据转换为正确的格式(正确的引用、null 的表示等)。

import pandas as pd
import json
record = {'DATE': '2020-11-05',
'PRODUCT': 'blue_banana',
'PRODUCT_DETAILS': json.dumps({'is_blue': True, 'is_kiwi': None}),
'ANALYSIS_META': json.dumps(None),
'PRICE': 13.02}
df = pd.DataFrame(record, index=[0])
2. 确保您使用 parse_jsonINSERT迭代
而不是使用 write_pandas正如最初尝试的那样,我们可以 INSERT逐行进入表格,确保指定 parse_json在所需的列 VARIANT类型,同时还将值编码为字符串(通过在其周围放置 ' 标记)。需要注意的是,如果您有大量数据,此解决方案将非常缓慢。
sql = """INSERT INTO MYDATABASE.MYSCHEMA.RESULTS
SELECT
to_date('{DATE}'),
'{PRODUCT}',
parse_json('{PRODUCT_DETAILS}'),
parse_json('{ANALYSIS_META}'),
{PRICE}
"""
### CREATE A SNOWFLAKE CONN...

for i, r in df.iterrows():
conn.cursor().execute(sql.format(**dict(r)))

关于python - 将 Pandas 中的 VARIANT 类型插入 Snowflake,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64702527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com