雪花 - 无法将暂存区域中的 JSON 拆分文件复制到表中

Posted

技术标签:

【中文标题】雪花 - 无法将暂存区域中的 JSON 拆分文件复制到表中【英文标题】:Snowflake - Can't copy JSON split files in Staging area to tables 【发布时间】:2021-04-25 00:58:09 【问题描述】:

我正在使用 Snowflake 和一些我需要上传到暂存区域的 JSON 文件。 由于 Snowflake 不允许大小超过 1GB 的文件,我不得不使用 7zip 将它们拆分成更小的文件。

I ended up with 4 files like the ones below

Files were uploaded to the Staging area 带有您在附图中看到的图案。

我正在尝试使用以下命令将暂存区域中的这些文件复制到另一个表中

copy into yelp_user from @staging/yelp_academic_dataset_user.json.gz  file_format
                                  =(format_name=yelp_user) on_error='skip_file';

这让我遇到了这个错误:

002019 (0A000): SQL compilation error:JSON file format can produce one and only one column of type variant or object or array. Use CSV file format if you want to load more than one column.

然后我尝试创建一个 JSON 表:

CREATE OR REPLACE TABLE json_table_user(json_data variant);

copy into JSON_TABLE_USER  file_format =(format_name = 'yelp_user') files=('yelp_academic_dataset_user.json.001.gz','yelp_academic_dataset_user.json.002.gz','yelp_academic_dataset_user.json.003.gz','yelp_academic_dataset_user.json.004.gz') on_error = 'skip_file';

我收到错误提示

Remote file 'https://gcpuscentral1-ncxq405-stage.storage.googleapis.com/tables/2807681033/yelp_academic_dataset_user.json.004.gz' was not found. There are several potential causes. The file might not exist. The required credentials may be missing or invalid. If you are running a copy command, please make sure files are not deleted when they are being loaded or files are not being loaded into two different tables concurrently with auto purge option.

这让我发疯了,因为以下 Snowflake 网站上的教程对我没有帮助。

有谁知道如何按照我需要的方式将这些拆分文件复制到表中?

【问题讨论】:

为什么Snowflake 无法加载> 1gb 的文件?在您给出的最后一个 COPY 语句中,所需的 FROM 子句在哪里? 因为我尝试在 Web 客户端上执行此操作,但我收到有关允许的最大大小的错误。在另一个 Copy 语句中,我没有包含它,因为默认情况下,Snowflake 将放置我正在处理的最后一个位置,该位置是暂存模式以及我拥有这些文件的位置。 您不应该尝试使用 WebUI 来加载大文件。如果您的文件在本地 PC 上,那么您需要使用 Snowsql 运行 put 命令将它们加载到内部阶段;如果您的文件在 AWS/Azure/GCP 上,那么您使用外部阶段。我建议您始终使用 FROM 子句,而不是假设 Snowflake 将在哪里查找文件 您也可以使用github.com/Mitch-Wheat/FileSplitter分割文件 请参阅***.com/a/68718176/132438 轻松将文件拆分成更小的文件。 【参考方案1】:

我不确定您的过程中出了什么问题,但我找到了一个类似的文件来重复它。

在这种情况下,我没有上传到 Snowflake 内部阶段,而是告诉 Snowflake 从 GCS 存储桶中读取它。为此,我首先创建了一个集成:

use role accountadmin;

CREATE STORAGE INTEGRATION fh_gcp
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = GCS
  ENABLED = TRUE
  STORAGE_ALLOWED_LOCATIONS = ('gcs://fhoffa-snow/')  
;
describe integration fh_gcp; 
-- give access to the snowflake gcp account to the bucket in gcp
grant usage on integration fh_gcp to role sysadmin;
--

use role sysadmin;

create stage fh_gcp_stage
url = 'gcs://fhoffa-snow/'
storage_integration = fh_gcp;

list @fh_gcp_stage; -- check files exist

然后我稍微修改了您的 SQL 以从这个阶段读取。请注意,我不需要拆分文件,Snowflake 很乐意读取大于 1gb 的文件:

create temp table json_table_user(json_data variant);

copy into JSON_TABLE_USER
from @fh_gcp_stage
file_format = (type=json)
files=('202104/yelp_academic_dataset_user.json.gz') on_error = 'skip_file'
;

然后您就可以开始享受查询和半结构化数据的乐趣了:

select median(json_data:average_stars) stars
    , median(json_data:review_count) reviews
    , median(json_data:funny) funny
    , median(json_data:useful) useful
    , count(*) c
from json_table_user ;

您在上面尝试的快速解决方法是将现有文件读入您​​创建的表中:

copy into json_table_user from @staging/yelp_academic_dataset_user.json.gz  file_format
                                  =(format_name=yelp_user) on_error='skip_file';

【讨论】:

感谢 Felipe,即使我不熟悉,这也是一个非常好的方法。 关于查询 json 表中的数据,如何在 tje BusinessParking 列的“车库”中检索值。 “地址”:“珍珠街 921 号”,“属性”:“酒精”:“'beer_and_wine'”,“氛围”:“'旅游':假,'时髦':假,'浪漫':假, 'divey': False, 'intimate': False, 'trendy': False, 'upscale': False, 'classy': False, 'casual': True", "BusinessParking": "'garage': False, 'street': True, 'validated': False, 'lot': False, 'valet': False" 我试过:json_data:attributes.BusinessParking.garage 但我得到的都是空值。 很高兴在一个新问题中回答这个问题(空间和格式) 抱歉,在注释中格式化代码很困难,事情就是这样。如果你可以看看我的另一个问题,***.com/questions/67305862/…,我会非常感谢它。

以上是关于雪花 - 无法将暂存区域中的 JSON 拆分文件复制到表中的主要内容,如果未能解决你的问题,请参考以下文章

Git学习

Git学习

git ---理论知识

git的基本概念

如何拆分 CSV 或 JSON 文件以获得最佳雪花摄取?

git 的使用方法