是否可以将镶木地板文件直接加载到雪花中? 如果是 - 怎么办?
谢谢。
是的,这是可能的,并且最好通过 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
我使用这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
是的 这可能是一个解决方案
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);
为 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'
;