簡體   English   中英

為什么 STD.FILE.LogicalFileList() 結果與 STD.FILE.GetLogicalFileAttribute(x,y) 不完全相關?

[英]Why does STD.FILE.LogicalFileList() results not completely correlate with STD.FILE.GetLogicalFileAttribute(x,y)?

我執行語句:

NrmFiles     := NOTHOR(STD.File.LogicalFileList());

這會生成包含在我的 HPCC 環境中的所有普通文件的數據集。 它具有記錄布局:

    string lib_fileservices__fslogicalfilename := string{maxlength(255)};

    record__0 := RECORD
       lib_fileservices__fslogicalfilename name;
    END;
    FsLogicalFileInfoRecord := RECORD(record__0)
      boolean  superfile;
      integer8 size;
      integer8 rowcount;
      string19 modified;
      string   owner{maxlength(255)};
      string   cluster{maxlength(255)};
    END;

出於我的目的,我需要創建/修改每個文件的工作單元,因此我投影該文件,該文件生成所有普通文件的數據集和附加的 WUID:

NrmFiles             := dataset('~temp::allfilelist::normal', FsLogicalFileInfoRecord, THOR);
/*--------------------------------------------------------------------------------------------------
| retrieve the workunit ID for each filenme
| The CATCH function executes the action (set the value returned to 'NOTFND') if the 
| GetLogicalFileAttribute expression fails for any reason
|------------------------------------------------------------------------------------------------*/
FN_Retrieve_WUID(string pFname) := FUNCTION
   RETURN CATCH(STD.File.GetLogicalFileAttribute('~'+TRIM(pFname),'workunit'), 'NOTFND');
END;
dsNormFilesWUID      := PROJECT(  NrmFiles
                                , TRANSFORM(  {FsLogicalFileInfoRecord; string WUID;}
                                            , SELF.WUID := FN_Retrieve_WUID(LEFT.name);
                                              SELF      := LEFT;
                                          ));
output(dsNormFilesWUID, ,'~temp::allfilelist::normal::wuid', compressed, overwrite, expire(30));

問題執行 GetLogicalFileAttribute 時無法找到某些文件。 這就是為什么我在語句周圍放置一個 CATCH() 並且它會返回一個“NOTFND”而不是失敗。 順便說一句,我必須在 hthor 上執行此操作,因為如果我在多節點 THOR 上執行,它將失敗並顯示“無法訪問 Dali - 這通常意味着正在從 thorslave 調用插件調用”。 並將調用包裝在 NOTHOR() 中會讓我遇到不同的失敗:“NOTHOR 表達式‘fn_retrieve_wuid’似乎訪問了父數據集——這可能會導致數據集不活動錯誤”

問題STD.File.LogicalFileList()是否從 DFU(分布式文件實用程序)檢索其信息? STD.File.GetLogicalFileAttribute(logicalfilename, attrname)是否從 DALI 檢索其信息(基於文件的元數據)?

我相信這些陳述是正確的(基於返回的數據類型)。 然而,這確實引起了人們的關注,即 DFU 和 DALI 可能會不同步。 我的意思是在同一個 BWR / 節點上,我可以獲得文件列表,並且當根據該列表中的文件名請求屬性時,可能找不到該文件名。

您的問題的答案是:這兩個函數都從 Dali 獲取所有元數據結果。

您的陳述“執行 GetLogicalFileAttribute 時未能找到某些文件。” 是這里唯一困擾我的事情。 我試着寫了一些測試代碼:

IMPORT Std;
NrmFiles := STD.File.LogicalFileList();
NrmFiles;
NewRec := {NrmFiles,STRING20 WUID};
PROJECT(NrmFiles,
        TRANSFORM(NewRec,
                  SELF.WUID := STD.File.GetLogicalFileAttribute('~'+LEFT.name,'workunit'),
                  SELF := LEFT)); 

因為這項工作只查看 DFU 元數據,所以沒有理由在 Thor 上運行它,所以它應該始終在 hThor 上運行。 我的代碼在我的測試系統上完美運行,總能找到我擁有的所有邏輯文件,無論它們是 OUTPUT 生成的還是噴灑的。

我建議您提交 JIRA 票證 ( https://track.hpccsystems.com ) 來報告此問題。 在執行此操作之前,您還應該探索 STD.File.GetLogicalFileAttribute() 函數未獲取的確切文件,以查看是否可以檢測到原因。 范圍檢查可能會阻止訪問,但可能性不大。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM