Azure ADLA作业:根据行内容写入不同的文件
我有一堆固定宽度的文本文件,其中包含多个事务类型,我只关心3个事务类型(121122124) 示例文件: D103421612100188300000000000001200000200001000032021420170012260214201700122600000005950000300001025798 D10342161220018830000000000000110000000000000000120537000282000040170000001024000000011NNYNY000010000030000000000 D103421612400188300000000000001000000000100000000000000000000CS00000000001200000033NN00000001200 所以我需要做的是从这些文件中逐行读取,并查找在startIndex=9和length=3处有121、122或124的文件 每一行都需要根据我拥有的数据字典进行解析,输出需要按事务类型分组到三个不同的文件中 我有一个有效的程序,但效率很低,基本上每行读3遍。我的代码是这样的:Azure ADLA作业:根据行内容写入不同的文件,azure,azure-data-lake,u-sql,Azure,Azure Data Lake,U Sql,我有一堆固定宽度的文本文件,其中包含多个事务类型,我只关心3个事务类型(121122124) 示例文件: D103421612100188300000000000001200000200001000032021420170012260214201700122600000005950000300001025798 D10342161220018830000000000000110000000000000000120537000282000040170000001024000000011NNYNY0
@121 = EXTRACT
col1 string,
col2 string,
col3 string //ect...
FROM inputFile
USING new MyCustomExtractor(
new SQL.MAP<string, string> {
{"col1","2"},
{"col2","6"},
{"col3","3"} //ect...
};
);
OUTPUT @121
TO 121.csv
USING Outputters.Csv();
@121=提取
col1字符串,
col2字符串,
col3字符串//等。。。
从输入文件
使用新的MyCustomExtractor(
新的SQL.MAP{
{“col1”,“2”},
{“col2”,“6”},
{“col3”,“3”}//等等。。。
};
);
输出@121
至121.csv
使用Outputters.Csv();
122和124的代码是一样的。我的自定义提取器获取SQL映射并返回已解析的行,并跳过所有不包含我要查找的事务类型的行
这种方法还意味着我在一个文件中的所有行中运行了3次。显然,这并没有它可能的那么有效
我要寻找的是一个高层次的概念,即最有效的方式来读取一行,确定它是否是我关心的事务,然后输出到正确的文件
提前感谢。使用String数据类型的
Substring
方法提前拉出事务类型如何?然后,您可以使用它进行一些工作、过滤等。一个简单的示例:
// Test data
@input = SELECT *
FROM (
VALUES
( "D103421612100188300000300000000012N000002000001000032021420170012260214201700122600000000059500000300001025798" ),
( "D103421612200188300000300000000011000000000010000012053700028200004017000000010240000010000011NNYNY000001000003N0000000000 00" ),
( "D1034216124001883000003000000000110000000000300000100000000000CS00000100000001200000033NN0 00000001200" ),
( "D1034216999 0000000000000000000000000000000000000000000000000000000000000000000000000000000 00000000000" )
) AS x ( rawData );
// Pull out the transaction type
@working =
SELECT rawData.Substring(8,3) AS transactionType,
rawData
FROM @input;
// !!TODO do some other work here
@output =
SELECT *
FROM @working
WHERE transactionType IN ("121", "122", "124"); //NB Note the case-sensitive IN clause
OUTPUT @output TO "/output/output.csv"
USING Outputters.Csv();
到目前为止,还没有任何特定的U-SQL函数可以动态定义元组的输出位置 wBob提出了一种潜在的解决方法。我将通过以下方式扩展解决方案以满足您的需求:
如果您有更多反馈或需求,请随时在我们的UserVoice网站上创建项目(并为其他人投票)。谢谢 请注意,此功能将在本月进行私人预览。如果您对测试感兴趣,请随时联系我。请注意,此功能将在本月进行私人预览。如果您对测试感兴趣,请随时联系我