Загрузка указанных чисел в таблицу снежинок из CSV с COPY TO <TABLE> - PullRequest
0 голосов
/ 10 октября 2019

У меня проблема с загрузкой данных CSV в таблицу снежинок. Поля заключены в двойные кавычки, и, следовательно, существует проблема с их импортом в таблицу.

Я знаю, что в COPY TO есть опция CSV FIELD_OPTIONALLY_ENCLOSED_BY = '"', но она вообще не работает.

Вот несколько примеров определения таблицы и команды копирования:

CREATE TABLE ...
(
GamePlayId NUMBER NOT NULL,
etc...
....);


COPY INTO ...
     FROM ...csv.gz'
FILE_FORMAT = (TYPE = CSV 
               STRIP_NULL_VALUES = TRUE 
               FIELD_DELIMITER = ',' 
               SKIP_HEADER = 1  
               error_on_column_count_mismatch=false 
               FIELD_OPTIONALLY_ENCLOSED_BY = '"'
              )
ON_ERROR = "ABORT_STATEMENT"
;

CSV-файл выглядит так:

"3922000","14733370","57256","2","3","2","2","2019-05-23 14:14:44",",00000000",",00000000",",00000000",",00000000","1000,00000000","1000,00000000","1317,50400000","1166,50000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000",",00000000"

Я получаю ошибку

'''Numeric value '"3922000"' is not recognized '''

IЯ уверен, что это потому, что значение NUMBER интерпретируется как строка, когда снежинка читает метки "", но поскольку я использую

FIELD_OPTIONALLY_ENCLOSED_BY = '"' 

, его даже не должно быть ... У кого-нибудь есть какое-то решение для этого

Ответы [ 3 ]

2 голосов
/ 10 октября 2019

Может, что-то не так с вашим файлом? Я только что смог запустить следующее без проблем.

1. create the test table:
CREATE OR REPLACE TABLE 
    dbNameHere.schemaNameHere.stacko_58322339 (
    num1    NUMBER,  
    num2    NUMBER, 
    num3    NUMBER);

2. create test file, contents as follows 
1,2,3
"3922000","14733370","57256"
3,"2",1
4,5,"6"

3. create stage and put file in stage 

4. run the following copy command
COPY INTO dbNameHere.schemaNameHere.STACKO_58322339
     FROM @stageNameHere/stacko_58322339.csv.gz
FILE_FORMAT = (TYPE = CSV 
               STRIP_NULL_VALUES = TRUE 
               FIELD_DELIMITER = ',' 
               SKIP_HEADER = 0  
               ERROR_ON_COLUMN_COUNT_MISMATCH=FALSE 
               FIELD_OPTIONALLY_ENCLOSED_BY = '"'
              )
ON_ERROR = "CONTINUE";

4. results 
+-----------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
| file                                                | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name |
|-----------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------|
| stageNameHere/stacko_58322339.csv.gz | LOADED |           4 |           4 |           4 |           0 | NULL        |             NULL |                  NULL | NULL                    |
+-----------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
1 Row(s) produced. Time Elapsed: 2.436s

5. view the records
>SELECT * FROM dbNameHere.schemaNameHere.stacko_58322339;
+---------+----------+-------+                                                  
|    NUM1 |     NUM2 |  NUM3 |
|---------+----------+-------|
|       1 |        2 |     3 |
| 3922000 | 14733370 | 57256 |
|       3 |        2 |     1 |
|       4 |        5 |     6 |
+---------+----------+-------+

Можете ли вы попробовать выполнить такой же тест, как этот?

РЕДАКТИРОВАТЬ: быстрый просмотр ваших данных показывает многие из ваших числовых полейначинаются с запятых, поэтому что-то определенно не так с данными.

0 голосов
/ 30 октября 2019

спасибо за помощь. Оказалось, что файл был в кодировке UTF16.

0 голосов
/ 11 октября 2019

Если предположить, что ваши числа имеют европейский формат , десятичное место и . тысячи, читая справку числовое форматирование , кажется, что Snowflake не поддерживает это как ввод. Я бы открыл запрос функции.

Но если вы читаете столбец как text, тогда используйте REPLACE , как

SELECT '100,1234'::text as A
    ,REPLACE(A,',','.') as B
    ,TRY_TO_DECIMAL(b, 20,10 ) as C;

, дает:

A         B         C
100,1234  100.1234  100.1234000000

безопаснее было бы сначала убрать заполнители, как

SELECT '1.100,1234'::text as A
  ,REPLACE(A,'.') as B
  ,REPLACE(B,',','.') as C
  ,TRY_TO_DECIMAL(C, 20,10 ) as D;
...