Snowflake:尝试展平变体列,但不返回结果集(不确定之前从 JSON 中剥离外部数组的步骤是否正常工作)

问题描述 投票:0回答:1

我正在从 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;
arrays json snowflake-cloud-data-platform flatten
1个回答
0
投票

感谢 NickWMike 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 
© www.soinside.com 2019 - 2024. All rights reserved.