如何在U-SQL中为文件夹下各文件添加列?遇E_CSC_USER_DATAPARTITIONEDOUTPUTNOTSUPPORTED错误
解决U-SQL的E_CSC_USER_DATAPARTITIONEDOUTPUTNOTSUPPORTED错误
错误原因分析
你碰到的E_CSC_USER_DATAPARTITIONEDOUTPUTNOTSUPPORTED错误,核心问题在于:当你从输入路径里提取了分区列(也就是代码里的filename和extension字段),又尝试直接把这些提取来的分区列用于输出分区时,U-SQL引擎目前不支持这种操作逻辑。引擎会把从输入路径解析出的字段标记为特殊的分区元数据,没法直接复用成输出分区的键。
解决方案
根据你的实际需求,分三种场景给出解决办法:
1. 不需要按原文件信息分区输出
如果你的目标只是把所有文件的数据合并输出,不需要按原filename/extension拆分文件,直接正常输出就行,完全避开分区输出逻辑:
@q = EXTRACT OrderID int, OrderDate DateTime?, CustomerName string, PhoneNumber string, DeliveryAddressLine1 string, DeliveryAddressLine2 string, CityName string, StockItemID int?, Quantity int?, UnitPrice float?, filename string, extension string FROM "/Orders/{filename}.{extension}" USING Extractors.Tsv(skipFirstNRows:1); -- 直接输出到单个文件(数据量大时引擎会自动拆分为多文件) OUTPUT @q TO "/Output/CombinedOrders.tsv" USING Outputters.Tsv(quoting:false);
2. 需要按原文件信息分区输出
如果必须按原filename/extension拆分输出文件,你可以通过重命名分区列的方式,让引擎把这些列当成普通计算列,而非输入分区元数据:
@q = EXTRACT OrderID int, OrderDate DateTime?, CustomerName string, PhoneNumber string, DeliveryAddressLine1 string, DeliveryAddressLine2 string, CityName string, StockItemID int?, Quantity int?, UnitPrice float?, filename string, extension string FROM "/Orders/{filename}.{extension}" USING Extractors.Tsv(skipFirstNRows:1); -- 给原分区列起别名,转换为普通可操作列 @q_renamed = SELECT *, filename AS OriginalFileName, extension AS OriginalFileExtension FROM @q; -- 使用别名作为输出分区键,绕开引擎限制 OUTPUT @q_renamed TO "/Output/Orders/{OriginalFileName}.{OriginalFileExtension}" USING Outputters.Tsv(skipFirstNRows:0);
这个方法的核心是避开引擎对输入分区列的特殊标记,让别名列成为普通的可用于分区的字段。
3. 替代方案:将原文件信息作为普通列写入
如果你的需求只是保留原文件的命名信息,而非拆分输出文件,也可以把filename和extension作为普通数据列写入输出,这样既满足需求又不会触发分区错误:
OUTPUT @q TO "/Output/Orders_WithFileInfo.tsv" USING Outputters.Tsv(skipFirstNRows:0);
输出的文件中会包含每一行数据对应的原文件名和扩展名。
内容的提问来源于stack exchange,提问作者NSS
相关产品推荐
相关产品推荐

