USQL中的文件存在功能

时间:2018-09-21 13:13:36

标签: azure u-sql

我正在用USQL做一个简单的测试,以检查文件是否存在,然后基于该文件执行合并操作。但是,我似乎无法正确理解。您能帮我吗,让我知道我要去哪里错了。

DECLARE @InputFile1 string = "/MergeTest/FINAL/Check1.csv";
DECLARE @InputFile2 string = "/MergeTest/STAGING/Test-{*}.json";                                                                         
DECLARE @OutputFile1 string = "/MergeTest/FINAL/Check1.csv";

IF (FILE.EXISTS(@InputFile1))
THEN
@Final = EXTRACT [ID] int,
                 [Name] string,
                 [City] string,
                 [Country] string
FROM @InputFile1
USING Extractors.Csv(skipFirstNRows:1);
END;

@Delta = EXTRACT [ID] int,
                 [Name] string,
                 [City] string,
                 [Country] string
FROM @InputFile2
USING new JsonExtractor("$.DEP[*]");

以下代码在IF条件下不起作用。我收到错误消息:@FileExists已经声明为标量变量。如果这是错误的实现方式,那么正确的方法是什么?

@FileExists = SELECT (FILE.EXISTS(@InputFile1)) AS exists_good FROM (VALUES (1)) AS T(dummy);

IF ####@FileExists THEN
    @result =   SELECT * FROM @Delta
                UNION ALL
                SELECT * FROM Final AS T1
                ANTISEMIJOIN (SELECT * FROM @Delta) AS T2
                ON T1.[ID] == T2.[ID];
ELSE
    @result =   SELECT * FROM @Delta;
END;

OUTPUT @result   
TO @OutputFile1
USING Outputters.Csv(outputHeader:true);

谢谢, 苏尼塔

1 个答案:

答案 0 :(得分:1)

只需编写以下内容:

IF FILE.EXISTS(@InputFile1) THEN ...

当您使用SELECT进行分配时,它基本上是一个行集,不能视为标量变量。

在您的示例中,我还注意到@inputFile1@outputFile1具有相同的文件名。我相信这会引起问题。确保它们与您的实际示例不同。