You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STD.FILE.LogicalFileList与GetLogicalFileAttribute结果不一致问题咨询

HPCC文件元数据查询相关问题及解答

获取常规文件数据集的代码

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的代码

为获取每个文件的创建/修改工作单元(WUID),对上述数据集执行PROJECT操作生成附加WUID的数据集:

NrmFiles             := dataset('~temp::allfilelist::normal', FsLogicalFileInfoRecord, THOR);
/*--------------------------------------------------------------------------------------------------
| retrieve the workunit ID for each filename
| 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执行时会报错No access to Dali - this normally means a plugin call is being called from a thorslave;用NOTHOR()包裹调用则报错NOTHOR expression 'fn_retrieve_wuid' appears to access a parent dataset - this may cause a dataset not active error。

咨询问题与解答

咨询问题

  1. STD.File.LogicalFileList()是否从DFU(Distributed File Utility,分布式文件工具)获取信息?
  2. STD.File.GetLogicalFileAttribute(logicalfilename, attrname)是否从DALI(基于文件元数据的服务)获取信息?
  3. 担心DFU与DALI不同步,导致同一节点上从文件列表获取的文件名,查询属性时无法找到。

解答

  1. STD.File.LogicalFileList()的数据源
    STD.File.LogicalFileList()确实从DFU获取文件列表信息。DFU负责HPCC集群中文件的分布式管理,涵盖文件存储位置、状态等内容,该函数会遍历DFU维护的文件目录结构,返回所有常规文件的基础信息。

  2. STD.File.GetLogicalFileAttribute()的数据源
    STD.File.GetLogicalFileAttribute()直接从DALI节点获取文件元数据。DALI作为HPCC的核心元数据服务,存储着所有文件的属性信息(包括WUID、创建时间、权限等),该函数通过调用DALI的接口查询指定文件的特定属性。

  3. DFU与DALI不同步的可能性
    DFU和DALI存在极小概率的不同步情况,主要出现在以下场景:

  • 文件创建/删除操作未完成同步:如刚创建的文件,DFU已记录文件存在,但DALI的元数据尚未更新;或文件已删除,DFU缓存未清理,但DALI已移除该文件的元数据。
  • 集群节点异常:部分节点故障可能导致元数据同步延迟。

不过HPCC的设计内置了同步机制,大部分情况下两者信息一致。若遇到大量文件找不到的情况,建议检查集群状态,或手动触发元数据同步操作。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:01:19