Формат внешнего файла DW Azure SQL обрабатывает пустые строки как NULL с использованием Polybase - PullRequest
0 голосов
/ 06 декабря 2018

Я использую внешние таблицы для загрузки данных из CSV, хранящихся в BLOB-объекте, в таблицу в хранилище данных SQL Azure.CSV использует разделитель строк (двойные кавычки), пустые строки представлены в виде 2 двойных кавычек ("").

Я хочу, чтобы пустые столбцы в таблице обрабатывались как NULL.Формат внешнего файла, который я использую, настроен с помощью USE_TYPE_DEFAULT = FALSE, но, похоже, это не работает, поскольку пустые столбцы импортируются как пустые строки.И это имеет тенденцию происходить только тогда, когда столбцы являются строками, числовые столбцы правильно преобразуются в NULL.

Я также импортирую другой файл CSV, в котором отсутствует разделитель строк, использующий другой формат внешнего файла, и те, которые пустыстолбцы импортируются как NULL.Так что, похоже, это как-то связано с опцией STRING_DELIMITER.

CSV:

col1;col2;col3;col4;col5;col6
"a";"b";"c";"1";"2";"3"
"d";"";"f";"4";"";"6"

Код формата внешнего файла:

CREATE EXTERNAL FILE FORMAT eff_string_del
WITH (
        FORMAT_TYPE = DELIMITEDTEXT
        ,FORMAT_OPTIONS(
            FIELD_TERMINATOR = ';'
            ,STRING_DELIMITER = '0x22'
            ,FIRST_ROW = 2
            ,USE_TYPE_DEFAULT = False)
    )

Код таблицы с использованием формата внешнего файла:

CREATE EXTERNAL TABLE dbo.test (
col1 varchar(1) null
,col2 varchar(1) null
,col3 varchar(1) null
,col4 int null
,col5 int null
,col6 int null
)
WITH (
        DATA_SOURCE = [EDS]
        ,LOCATION = N'test.csv'
        ,FILE_FORMAT = eff_string_del
        ,REJECT_TYPE = VALUE
        ,REJECT_VALUE = 0
        )

Результат при запросе внешней таблицы:

SELECT *
FROM [dbo].[test]

col1 col2 col3 col4        col5        col6
---- ---- ---- ----------- ----------- -----------
a    b    c    1           2           3
d         f    4           NULL        6

Может кто-нибудь помочь мне объяснить, что происходит или что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 23 августа 2019

Используйте USE_TYPE_DEFAULT = False во внешнем формате файла.Любые значения NULL, которые хранятся с использованием слова NULL в текстовом файле с разделителями, импортируются как строка 'NULL'.

Например:

CREATE EXTERNAL FILE FORMAT example_file_format
WITH (FORMAT_TYPE = DELIMITEDTEXT,
      FORMAT_OPTIONS(
          FIELD_TERMINATOR = ',',
          STRING_DELIMITER = '"',
          FIRST_ROW = 2, 
          USE_TYPE_DEFAULT = False)
)

Ссылка: https://docs.microsoft.com/en-us/sql/t-sql/statements/create-external-file-format-transact-sql?view=sql-server-2017

0 голосов
/ 10 декабря 2018

Рассматривали ли вы добавление значения NULL в это поле вместо ""?

См. Ниже тест, который я провел, используя следующий код:

declare @mytable table
(id int identity primary key, column1 varchar(100))

insert into @mytable (column1)  values ('test1')
insert into @mytable (column1)  values ('test2')
insert into @mytable (column1)  values (null)
insert into @mytable (column1)  values ('test3')
insert into @mytable (column1)  values (null)

select
*
from    @mytable

результаты выглядят так:

enter image description here

Будет ли это работать для вас?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...