我有很多文件要尝试合并。我碰巧知道每个文件中的许多列都只包含空值,我可以不用它们。如何编写 U-SQL 语句来从文件中提取数据,检查除了空值之外什么都没有的列并排除它们?
谢谢!
我有很多文件要尝试合并。我碰巧知道每个文件中的许多列都只包含空值,我可以不用它们。如何编写 U-SQL 语句来从文件中提取数据,检查除了空值之外什么都没有的列并排除它们?
谢谢!
最有效的方法可能是编写一个自定义提取器,它只跳过只包含空值的行。
否则,您可以编写如下内容(注意非对象类型上的空指示符):
@data = EXTRACT c1 string, c2 int?, c3 DateTime? // ... more columns
FROM "/path/file.csv"
USING Extractors.Csv();
@data = SELECT * FROM @data WHERE c1 != null AND c2 != null AND c3 != null;
(请注意,您很可能必须将null
转换为比较中的列类型)。
如果不同文件之间的架构不同,您还可以使用所谓的处理器进行过滤,该处理器可以查看输入行的架构。类似的东西
@data = PROCESS @data PRODUCE c1 string, c2 int?, c3 DateTime?
USING new MyAsm.NullFilterProcessor();
您必须在哪里NullFilterProcessor
实现IProcessor
.
@data = EXTRACT c1 string, c2 int?, c3 DateTime? // ... more columns
FROM "/path/file.csv"
USING Extractors.Csv();
有时上面的代码也会显示错误,只要空值已经被一些其他值替换,如“”、“\N”、空等。
使用 Extractors.Csv(nullEscape:"\N");
所以我们必须在默认的 Extractor 中使用 nullEscape 参数来排除文件中的空值。