如何在不使用 sql 的情况下从数据湖存储上的 csv 文件中删除一行?

How to delete a row from csv file on datalake store without using usql?

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

我想在不使用 usql 的情况下执行此操作,以避免使用 usql 涉及的成本因素。我们还有哪些其他可行的方法?

与其他大数据分析平台一样,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

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

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