U-SQL
использует систему типов C #, поэтому вам нужно определять типы и присваивать значения с использованием синтаксиса C #.Это означает, что вам нужно будет использовать обнуляемый тип и назначить правильно набранные null
значения:
Поскольку string
уже является обнуляемым типом, вы можете просто использовать:
DECLARE @missing_column string = (string)null;
Хотя, если вы пытаетесь использовать необнуляемый тип, такой как int
, вам нужно будет указать версию с нулевым значением в столбце переменной и таблицы:
DECLARE @missing_column int? = (int?)null;
Официальная документация по U-SQL DECLARE
утверждений можно найти здесь .
Перечитав свой вопрос, для вашего конкретного примера вы просто должны быть в состоянии игнорировать пропущенный столбец в своем выражении INSERT
,Это назначит значения из исходной таблицы, где они были назначены, и оставит дополнительный, неопределенный целевой столбец null
.Для этого вам, очевидно, потребуется иметь обнуляемый тип в столбце таблицы в соответствии с тем, что я написал выше:
Определение основной таблицы:
CREATE TABLE dbo.MasterTarget
(
Col1 Int,
Col2 string, // string is already nullable
Col3 DateTime?, // DateTime is not, so need to specify DateTime? that accepts null values
INDEX clx_Col1 CLUSTERED(Col1 ASC)
)
DISTRIBUTED BY HASH(Col1);
Загрузка данных всех столбцов:
@src1 =
EXTRACT Col1 Int,
Col2 string,
Col3 DateTime
FROM "/SourceFile1.csv"
USING Extractors.Csv();
INSERT INTO dbo.MasterTarget
(
Col1,
Col2,
Col3
)
SELECT Col1,
Col2,
Col3
FROM @src1;
Отсутствует загрузка данных столбца:
@src2 =
EXTRACT Col1 Int,
Col2 string
FROM "/SourceFile2.csv"
USING Extractors.Csv();
INSERT INTO dbo.MasterTarget
(
Col1,
Col2
)
SELECT Col1,
Col2
FROM @src2;