U-SQL按文件名生成动态路径输出.dsv文件报错如何解决
U-SQL动态生成输出路径问题解决
错误根因
你遇到的E_CSC_USER_EXPRESSIONNOTCONSTANTFOLDABLE错误和逻辑问题有两个核心原因:
- U-SQL默认要求
OUTPUT语句的TO参数是编译时可确定的常量,你用变量拼接的动态路径无法通过编译检查。 - 你直接对通配符字符串
"*.dsv"做字符串截取,根本无法获取每个实际源文件的文件名信息,拿到的只会是*、.这些通配符字符,不可能提取到正确的代码、日期等字段。
解决方法
U-SQL支持文件集提取+分区输出的能力实现按源文件名动态生成输出路径,不需要手动拼接变量,正确代码如下:
// 启用分区输出功能(稳定可用,低版本环境需要加,高版本可省略) SET @@FeaturePreviews = "PartitionedOutput:on"; // 读取文件时直接通过文件集规则拆分文件名中的各字段为数据列 @raw_data = EXTRACT col1 string, col2 string, col3 string, // 从文件名中按规则提取所需字段,和FROM后的文件名模板占位符对应 FileCode string, Year string, Month string, Day string FROM "{FileCode}_{Year}{Month}{Day}@*.dsv" USING Extractors.Text(delimiter : '|', quoting: false); // 你的业务处理逻辑,这里可以对@raw_data做任意清洗转换得到@result @result = SELECT col1, col2, col3, FileCode, Year, Month, Day FROM @raw_data; // 分区输出,路径中的占位符会自动替换为对应列的值 OUTPUT @result TO "test/{FileCode}/{Year}/{Month}/{Day}/File_Data.dsv" USING Outputters.Text(delimiter : '|', quoting: false) // 指定分区字段,必须和路径中的占位符完全对应 PARTITION BY FileCode, Year, Month, Day;
注意事项
- 文件名模板
"{FileCode}_{Year}{Month}{Day}@*.dsv"要和你的实际源文件命名规则完全匹配,确保能正确拆分出各个字段。 PARTITION BY后面的字段必须全部出现在@result的输出列中,且和路径里的占位符一一对应。- 每个分区的内容会自动写入对应的路径文件,完全符合你要求的
test/ABC/2020/04/21/File_Data.dsv的输出规则。
内容的提问来源于stack exchange,提问作者Priyanka2304
相关产品推荐
相关产品推荐

