Снежинка, не может импортировать многораздельные файлы паркета в базу данных - PullRequest
0 голосов
/ 08 февраля 2019

Копия - https://community.snowflake.com/s/question/0D50Z00008lq9RGSAY/cannot-import-partitioned-parquet-files-to-a-database

В корзине 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' не распознается

Возможно, это что-то связанное с регулярным выражением, но я не знаю, что именно.

1 Ответ

0 голосов
/ 10 февраля 2019

Следующее должно сделать это, чтобы вы соответствовали s3://<bucket>/data/id1=<int>/id2=<int>/file.parquet:

.*\/id1=(.*)\/.*

Вам не нужно экранировать \, если вы используете его для экранирования других символов.В вашем случае \ используется для экранирования /.Так что, используя \ достаточно одного раза.

...