如何在U-SQL中从文件名提取DateTime类型数据?
解决U-SQL从文件名提取日期转换为DateTime的问题
这个问题很常见——U-SQL的EXTRACT语句没办法直接把20171201这种无分隔符的日期字符串映射到DateTime类型,因为它默认会用标准的日期格式(比如yyyy-MM-dd)去解析,而你的文件名里的日期是紧凑的yyyyMMdd格式,自然匹配失败。
解决思路很简单:先把文件名里的日期提取为字符串类型,再通过指定格式解析成DateTime,具体步骤如下:
1. 先提取日期为字符串
在EXTRACT里把日期部分定义为string类型,确保能正确从文件名中捕获到20171201这段内容:
@data = EXTRACT filename_date_str string, -- 这里加上你实际需要提取的其他列 product string, sales int FROM "/input/vga_{filename_date_str}.txt" USING Extractors.Tsv(skipFirstNRows:1);
2. 转换字符串为DateTime
用DateTime.ParseExact方法,明确指定日期格式为"yyyyMMdd",这样就能准确解析紧凑格式的日期字符串了:
@formatted_data = SELECT DateTime.ParseExact( filename_date_str, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture ) AS filename_date, product, sales FROM @data;
3. (可选)健壮性优化:处理格式错误
如果担心某些文件名的日期格式不符合预期,可以用DateTime.TryParseExact来避免整个查询失败——格式不对的话会返回null而不是抛出错误:
@formatted_data = SELECT DateTime.TryParseExact( filename_date_str, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out DateTime parsed_date ) ? parsed_date : (DateTime?)null AS filename_date, product, sales FROM @data;
最后输出结果
把处理后的结果输出到目标路径即可:
OUTPUT @formatted_data TO "/output/vga_sales_with_date.tsv" USING Outputters.Tsv();
这样就能完美解决你遇到的问题啦——先捕获字符串,再按指定格式转换,避开U-SQL默认解析的限制。
内容的提问来源于stack exchange,提问作者Vijay Kumar Sharma
相关产品推荐
相关产品推荐

