如何在不使用usql的情况下从datalake商店中删除csv文件中的行?

时间:2017-08-01 11:15:52

标签: unit-testing azure azure-data-lake

我正在编写一个单元测试,用于将数据附加到datalake上的CSV文件中。我想通过查找附加到同一文件的测试数据来测试它,一旦我找到它,我想删除我插入的行。基本上,一旦我找到测试数据我的测试将通过但是因为测试是在生产中运行所以我必须搜索我的测试数据,即找到我已插入文件的行并在测试运行后删除它。

我想在不使用usql的情况下这样做,以避免使用usql所涉及的成本因素。我们可以采取哪些其他可行方式?

2 个答案:

答案 0 :(得分:1)

您无法从文件中删除行(或任何部分)。 Azure数据湖存储是一个仅附加文件系统。一旦提交的数据无法删除或更新。如果您在生产中进行测试,您的应用程序需要了解测试行并适当地忽略它们。

另一种选择是读取U-SQL中的所有行,然后编写一个不包括测试行的输出。

答案 1 :(得分:0)

与其他大数据分析平台一样,ADLA / U-SQL本身也不支持附加到文件。你可以做的是获取一个输入文件,向它添加一些内容(例如通过U-SQL)并将其作为另一个文件写出来,例如一个简单的例子:

DECLARE @inputFilepath string = "input/input79.txt";
DECLARE @outputFilepath string = "output/output.txt";


@input =
    EXTRACT col1 int,
            col2 DateTime,
            col3 string
    FROM @inputFilepath
    USING Extractors.Csv(skipFirstNRows : 1);


@output =
    SELECT *
    FROM @input

    UNION ALL

    SELECT *
    FROM(
        VALUES
        (
            2,
            DateTime.Now,
            "some string"
        ) ) AS x (col1, col2, col3);


OUTPUT @output
TO @outputFilepath
USING Outputters.Csv(quoting : false, outputHeader : true);

如果您想进一步控制,可以通过Powershell SDK做一些事情,例如测试项目是否存在:

Test-AdlStoreItem -Account $adls -Path "/data.csv"

或使用Move-AzureRmDataLakeStoreItem移动项目。更多细节在这里:

Manage Azure Data Lake Analytics using Azure PowerShell