在S3存储桶上,我已经分区了要导入的实木复合地板文件。文件s3://<bucket>/data/id1=<int>/id2=<int>/file.parquet
的结构。我以本文为例:https://www.snowflake.com/blog/how-to-load-terabytes-into-snowflake-speeds-feeds-and-techniques/。但是,进行一些修改后,导入解决方案将不起作用。这是一个SQL:
COPY INTO PARQUET from (
select
NULLIF(
regexp_replace (
METADATA$FILENAME,
'.*\\/id1=(.*)\\/.*',
'\\1'),
'__HIVE_DEFAULT_PARTITION__'
) as id1,
NULLIF(
regexp_replace (
METADATA$FILENAME,
'.*\\/id2=(.*)\\/.*',
'\\1'),
'__HIVE_DEFAULT_PARTITION__'
) as id2,
$1:other as other
from @test_parquet_stage/data/) pattern= '.*/id1=.*/id2=.*/.*';
我收到“检测到递归文件加载,跳过命令”。您有什么想法,为什么不起作用?谢谢!
更新:
经过一些修改,我只能使用一个正则表达式加载数据。如文章所示。我的SQL:
select
NULLIF(
regexp_replace (
METADATA$FILENAME,
'.*\\/id1=(.*)\\/.*',
'\\1'),
'__HIVE_DEFAULT_PARTITION__'
) as id1,
$1:other as other
from @test_parquet_stage/data/) pattern= '.*/.*';
但是,当我添加第二个时,会发生以下错误:
无法识别数值'0 / id2 = 11'
可能与正则表达式有关,但我不知道到底是什么。
答案 0 :(得分:0)
以下应为您匹配s3://<bucket>/data/id1=<int>/id2=<int>/file.parquet
:
.*\/id1=(.*)\/.*
如果您使用\
来转义其他字符,则无需转义。在您的情况下,\
用于转义/
。因此,仅使用\
就可以了。