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。
咨询问题与解答
咨询问题
STD.File.LogicalFileList()是否从DFU(Distributed File Utility,分布式文件工具)获取信息?STD.File.GetLogicalFileAttribute(logicalfilename, attrname)是否从DALI(基于文件元数据的服务)获取信息?- 担心DFU与DALI不同步,导致同一节点上从文件列表获取的文件名,查询属性时无法找到。
解答
STD.File.LogicalFileList()的数据源STD.File.LogicalFileList()确实从DFU获取文件列表信息。DFU负责HPCC集群中文件的分布式管理,涵盖文件存储位置、状态等内容,该函数会遍历DFU维护的文件目录结构,返回所有常规文件的基础信息。STD.File.GetLogicalFileAttribute()的数据源STD.File.GetLogicalFileAttribute()直接从DALI节点获取文件元数据。DALI作为HPCC的核心元数据服务,存储着所有文件的属性信息(包括WUID、创建时间、权限等),该函数通过调用DALI的接口查询指定文件的特定属性。DFU与DALI不同步的可能性
DFU和DALI存在极小概率的不同步情况,主要出现在以下场景:
- 文件创建/删除操作未完成同步:如刚创建的文件,DFU已记录文件存在,但DALI的元数据尚未更新;或文件已删除,DFU缓存未清理,但DALI已移除该文件的元数据。
- 集群节点异常:部分节点故障可能导致元数据同步延迟。
不过HPCC的设计内置了同步机制,大部分情况下两者信息一致。若遇到大量文件找不到的情况,建议检查集群状态,或手动触发元数据同步操作。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

