Azure Data Lake Store上的文件哈希

时间:2018-08-14 15:29:35

标签: powershell azure-data-lake azure-data-factory-2

使用azure数据湖存储和azure分析是我的新手。

问题

  

是否有一种方法可以获取存储在Azure Datalake存储中的文件的哈希值?这样我就可以分析数据是否已更改

我有一堆结构相似的输入文件

  • /输入/

    • Client-01 /
    • 产品-A /
      • Input01.csv
  • /输入/

    • Client-02 /
    • 产品-A /
      • Input01.csv
      • Input02.csv

我尝试了什么

第01部分

我能够在本地获取Get-FileHash,但找不到ADLS的任何内容或与此类似的远程内容

Get-FileHash 
   "Input/Client-01/*.csv" -Algorithm MD5 | ConvertTo-Json >> statistics.json

生成类似哈希的

[
    {
        "Algorithm":  "MD5",
        "Hash":  "BA961B4B72DC602C2D2CA2B13EFC09DB",
        "Path":  "Input/Client-01/Input01.csv"
    },
    {
        "Algorithm":  "MD5",
        "Hash":  "B0528707D4E689EEEFE1AA1811063014",
        "Path":  "Input/Client-02/Input01.csv"
    },
    {
        "Algorithm":  "MD5",
        "Hash":  "60D71494355E7EE941782F1BE2969F3C",
        "Path":  "Input/Client-02/Input02.csv"
    }
]

Part 02

我能够使用

获得更多详细信息
Get-AzureRmDataLakeStoreChildItem -Account 
   $datalakeStoreName -Path 
   $path | ConvertTo-Json

这将导致

{
    "LastWriteTime":  "\/Date(1534185132238)\/",
    "LastAccessTime":  "\/Date(1534185132180)\/",
    "Expiration":  null,
    "Name":  "Input01.csv",
    "Path":  "/Input/Client-01/",
    "AccessTime":  1534185132180,
    "BlockSize":  268435456,
    "ChildrenNum":  null,
    "ExpirationTime":  null,
    "Group":  "e045d366-777b-4e7a-a01d-79dbf0e28a61",
    "Length":  127,
    "ModificationTime":  1534185132238,
    "Owner":  "3bb6c9c4-da61-4cc2-b6ef-f4739adafff5",
    "PathSuffix":  "Input01.csv",
    "Permission":  "770",
    "Type":  0,
    "AclBit":  true
}

缺点:

  • 没有哈希:(
  • 按计划运行它会涉及到数据工厂中的批处理服务(从技术上讲,这不是缺点,但对我而言,这是因为我已经投资了批处理服务。)

第3部分:使用ADLS nuget

ADLS nuget支持少数端点。我专门查看了DirectoryEntry,但是该模型并未公开其他端点中可用的BlockSize:(

  

https://github.com/Azure-Samples/data-lake-store-adls-dot-net-get-started/blob/master/AdlsSDKGettingStarted/Program.cs

private static void PrintDirectoryEntry(DirectoryEntry entry)
        {
            Console.WriteLine($"Name: {entry.Name}");
            Console.WriteLine($"FullName: {entry.FullName}");
            Console.WriteLine($"Length: {entry.Length}");
            Console.WriteLine($"Type: {entry.Type}");
            Console.WriteLine($"User: {entry.User}");
            Console.WriteLine($"Group: {entry.Group}");
            Console.WriteLine($"Permission: {entry.Permission}");
            Console.WriteLine($"Modified Time: {entry.LastModifiedTime}");
            Console.WriteLine($"Last Accessed Time: {entry.LastAccessTime}");
            Console.WriteLine();
        }

第4部分:使用webHDFS API(有效)

  

https://docs.microsoft.com/en-us/rest/api/datalakestore/webhdfs-filesystem-apis

我能够使用op=LISTSTATUS documentation link来获得同时具有FileStatusesblocksize的{​​{1}}。所以这很有帮助

length

1 个答案:

答案 0 :(得分:0)

您是要确定文件是否已更改,还是要实际确定文件中已更改的行?如果要确定行更改,请使用ADLA作业运行创建行哈希的U-SQL脚本或函数。

如果要确定文件是否已更改,我怀疑您需要运行一个作业来遍历所有文件,并为每个文件生成一个哈希。然后,您可以将该值存储在另一个文件或表中,在该表中维护文件列表和历史哈希值。 这不是一个单一步骤的过程,Azure Data Factory或PowerShell Runbook将是编排此过程的最佳方法。