如何将镶木地板文件加载到Snowflake数据库中?

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

是否可以将镶木地板文件直接加载到雪花中? 如果是 - 怎么办?

谢谢。

database parquet snowflake-cloud-data-platform
4个回答
9
投票

是的,这是可能的,并且最好通过 S3 完成。请注意,以下假设您有一个 MY_PARQUET_LOADER 表、一个 STAGE_SCHEMA 架构和一个定义的 S3STAGE,并且您的 parquet 文件位于 /path/ key/folder 下的存储桶中。

  copy into STAGE_SCHEMA.MY_PARQUET_LOADER
     from ( 
       select
       $1
     ,metadata$filename as metadata_filename
     ,metadata$file_row_number as metadata_file_row_number  
     ,current_timestamp() as load_timestamp
       from
  @S3STAGE/path/)
   pattern = '.*.parquet'
  file_format = (
  TYPE = 'PARQUET' 
  SNAPPY_COMPRESSION = TRUE    )
  ON_ERROR = 'SKIP_FILE_1%'
  purge= TRUE;

存在的地方:

create or replace TABLE MY_PARQUET_LOADER (
    RAW VARIANT,
    METADATA_FILENAME VARCHAR(16777216),
    METADATA_FILE_ROW_NUMBER NUMBER(38,0),
    LOAD_TIMESTAMP TIMESTAMP_LTZ(9)
) cluster by (METADATA_FILENAME);

值得阅读的精美手册:
https://docs.snowflake.net/manuals/sql-reference/sql/copy-into-table.html


1
投票

我使用这2条sql来创建数据并将其加载到表中,这可能会让你的生活更轻松

首先:使用这条SQL创建表sql

with cols as (
select COLUMN_NAME || '   ' || TYPE  col
  from table(
    infer_schema(
      location=>'@LANDING/myFile.parquet'
      , file_format=>'LANDING.default_parquet'
      )
  ) 
),
temp as (
    select 'create or replace table myTable (' col1
    union
    select listagg(col, ',') col1
    from cols
    union
    select ') ' col1
)
select listagg(col1) 
from temp

其次,使用此 SQL 创建 SQL 副本,将数据加载到表中

with cols as (
select expression 
  from table(
    infer_schema(
      location=>'@LANDING/myFile.parquet'
      , file_format=>'LANDING.default_parquet'
      )
  )
),
temp as (
    select 'copy into myTable from ( select ' col1
    union
    select listagg(expression, ',') col1
    from cols
    union
    select 'from @LANDING/myFile.parquet ) ' col1
)
select listagg(col1) 
from temp 

0
投票

是的 这可能是一个解决方案

create or replace TABLE MY_PARQUET_LOADER (
    RAW VARIANT,
    METADATA_FILENAME VARCHAR(16777216),
    METADATA_FILE_ROW_NUMBER NUMBER(38,0),
    LOAD_TIMESTAMP TIMESTAMP_LTZ(9)
) cluster by (METADATA_FILENAME);

0
投票

为 parquet 创建文件格式,USE_LOGICAL_TYPE = TRUE 将确保保存为 INT(纪元)的时间将转换为日期时间。

CREATE OR REPLACE FILE FORMAT parquet_ff
  TYPE = parquet
  USE_LOGICAL_TYPE = TRUE;

在 Snowflake 上创建表,您可以在其中从舞台上的 parquet 文件中推断架构。

CREATE OR REPLACE TABLE myTable USING TEMPLATE (
SELECT ARRAY_AGG(OBJECT_CONSTRUCT(*)) 
WITHIN GROUP (ORDER BY ORDER_ID)
FROM TABLE (
    INFER_SCHEMA(
      LOCATION=>'@stage/path/to/parquet'
      , FILE_FORMAT=>'parquet_ff'
      )));

使用选项

MATCH_BY_COLUMN_NAME = 'CASE_INSENSITIVE'
从 parquet 文件复制到新创建的表中,以按列名称进行匹配。检查其他可能的选项这里

copy into myTable
from @stage/path/to/parquet 
FILE_FORMAT  = parquet_ff
MATCH_BY_COLUMN_NAME = 'CASE_INSENSITIVE'
;
© www.soinside.com 2019 - 2024. All rights reserved.