我正在从 API 中提取 JSON 文件并使用 python 将其加载到 S3 存储桶中。从那里,我在 Snowflake 中创建一个外部阶段,准备将 json 文件复制到表中的变体列中。最后一步是展平变体列并最终根据 json/变体数据创建一个新表。但是,我陷入了尝试压平变体列的步骤。阅读雪花文档和其他堆栈溢出帖子后,不确定我是否正确执行了展平步骤。
第 1 步: Python - 从 API ('https://fakestoreapi.com/products') 提取 JSON 文件,并使用 python 将其加载到 S3 存储桶中。这似乎按预期工作。
import requests
import boto3
import json
r = requests.get('https://fakestoreapi.com/products')
data = r.text
s3 = boto3.client('s3',
aws_access_key_id='key_entered_here',
aws_secret_access_key='secret_entered_here')
s3.put_object(
Body=json.dumps(data),
Bucket='s3_bucket_name_entered_here',
Key='products.json'
第 2 步: Snowflake - 创建文件格式并创建外部阶段,准备将 json 文件加载到雪花中的表中(此步骤似乎有效,但我不确定外部数组是否被剥离,因为一旦文件在步骤 3 中加载到变体列中,我看到外括号“[]”包裹了数据集):
-- Create file format
CREATE OR REPLACE FILE FORMAT JSON_FORMAT TYPE = 'JSON'
STRIP_OUTER_ARRAY = TRUE;
-- Create external stage
CREATE OR REPLACE STAGE [Stage_name]
url='s3_bucket_name'
credentials=(aws_key_id='key_id_entered_here' aws_secret_key='secret_key_entered_here')
FILE_FORMAT='JSON_FORMAT';
第 3 步: Snowflake - 创建包含变量列的 raw_source 表,并将 json 文件从外部阶段复制到表中,如下所示(变量列的 SELECT 语句的结果集示例如下所示 SQL):
CREATE OR REPLACE TABLE raw_source (
SRC VARIANT);
COPY INTO raw_source
FROM @FakeStore.Public.FakeStore_Stage
FILE_FORMAT = JSON_FORMAT;
-- Querying from the src variant column shows outer array still entacted?
SELECT src FROM raw_source;
"[{"id":1,"title":"Fjallraven - Foldsack 1 号背包,适合 15 台笔记本电脑","price":109.95,"description":"适合日常使用和在森林中散步的完美背包。将您的笔记本电脑(最大 15 英寸)存放在软垫套中,您的日常用品","类别":"男装","图片":"https://fakestoreapi.com/img/81fPKd-2AYL。AC_SL1500。 jpg","评级":{"rate":3.9,"count":120}}, {"id":19,"title":"Opna 女式短袖保湿","price":7.95,"description":"100% 涤纶,机洗,100% 阳离子涤纶双面布,机洗和预缩水非常合身、轻盈、宽敞、高度透气,采用吸湿排汗面料,有助于保持水分,柔软轻质面料,配有舒适的 V 领和修身版型,打造时尚、更具女性气质的轮廓,增加舒适感","类别": "女装","image":"https://fakestoreapi.com/img/51eg55uWmdL.AC_UX679.jpg"," rating":{"rate":4.5,"count":146}},{" id":20,"title":"DANVOUY 女式 T 恤休闲棉质短裤","price":12.99,"description":"95%棉,5%氨纶,特点:休闲,短袖,字母印花,V-领口,时尚 T 恤,面料柔软,有一定的弹性。场合:休闲/办公室/海滩/学校/家庭/街头。季节:春、夏、秋、冬。","category":"女装", “图像”:“https://fakestoreapi.com/img/61pHAEJ4NML。AC_UX679.jpg”,“评级”:{“率”:3.6,“计数”:145}}]“
第 4 步:雪花 - 下面的 SELECT 语句尝试展平变体列,但不返回结果集。在阅读了雪花文档和其他堆栈溢出帖子后,我不确定我是否正确执行了这一步。这就是我目前陷入困境的地方。
SELECT
final.value:id::number as id
,final.value:title::varchar as title
,final.value:price::number as price
,final.value:description::varchar as description
,final.value:category::varchar as category
,final.value:image::varchar as image
,final.value:rating::varchar as rating
FROM raw_source AS rs, LATERAL FLATTEN(input => rs.src) as final;
感谢 NickW 和 Mike Walton 在这里发表的评论,以及 Snowflake 论坛上的人们的一些帮助,我能够在这里解决我的问题。
有两件事需要更新。
第一个与我的问题中的步骤1有关。 这是更正后的Python 第 6 行从“r.text”更新为“r.json()” 第 12 行更新为“Body=data
”import requests
import boto3
import json
r = requests.get('https://fakestoreapi.com/products')
data = r.json()
s3 = boto3.client('s3',
aws_access_key_id='[AccessID]',
aws_secret_access_key='[AccessKey]')
s3.put_object(
Body=data,
Bucket='fakestore01',
Key='products.json'
)
第二个与我的问题中的步骤4有关 更正后的 SQL SELECT 语句如下:
SELECT
src:id::number AS ID
,src:title::varchar AS Title
,src:price::float AS Price
,src:description::varchar AS Description
,src:category::varchar AS Category
,src:image::varchar AS ImageURL
,src:rating:rate::float AS RatingRate
,src:rating:count::number AS RatingCount
FROM raw_source