Как я могу добавить штамп даты и времени в zip-файл при выгрузке данных из снежинки в s3? - PullRequest
0 голосов
/ 04 мая 2020

Я хочу иметь возможность добавить метку времени к имени файла, который я пишу в s3. До сих пор я мог записывать файлы в AWS S3, используя пример ниже. Может кто-нибудь подсказать мне, как мне go поставить отметку даты и времени в имени файла?

copy into     @s3bucket/something.csv.gz
from (select * from  mytable)
file_format = (type=csv  FIELD_OPTIONALLY_ENCLOSED_BY = '"' compression='gzip' )
single=true
header=TRUE;

Заранее спасибо.

1 Ответ

1 голос
/ 05 мая 2020

Синтаксис для определения пути внутри части этапа или местоположения оператора COPY INTO не позволяет функциям динамически определять его в SQL.

Однако, Вы можете использовать хранимую процедуру для выполнения sh построения динамических c запросов, используя JavaScript API даты и некоторое форматирование строки .

Вот очень тривиальный пример для вашего варианта использования, с некоторым кодом , адаптированным из другого вопроса :

CREATE OR REPLACE PROCEDURE COPY_INTO_PROCEDURE_EXAMPLE()
RETURNS VARIANT
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$
    var rows = [];

    var n = new Date();
    // May need refinement to zero-pad some values or achieve a specific format
    var datetime = `${n.getFullYear()}-${n.getMonth() + 1}-${n.getDate()}-${n.getHours()}-${n.getMinutes()}-${n.getSeconds()}`;

    var st = snowflake.createStatement({
        sqlText: `COPY INTO '@s3bucket/${datetime}_something.csv.gz' FROM (SELECT * FROM  mytable) FILE_FORMAT=(TYPE=CSV  FIELD_OPTIONALLY_ENCLOSED_BY='"' COMPRESSION='gzip') SINGLE=TRUE HEADER=TRUE;`
    });

    var result = st.execute();
    result.next();
    rows.push(result.getColumnValue(1))

    return rows;
$$

Чтобы выполнить, выполните:

CALL COPY_INTO_PROCEDURE_EXAMPLE();

Выше не хватает обработанной обработки формата даты (месяцы заполнения, дни, часы, минуты, секунды), обработки ошибок (если COPY INTO не удается), параметризации входного запроса и т. Д. c. но это должно дать общее представление о том, как этого добиться.

...