Azure ADLA作业:根据行内容写入不同的文件

Azure ADLA作业:根据行内容写入不同的文件,azure,azure-data-lake,u-sql,Azure,Azure Data Lake,U Sql,我有一堆固定宽度的文本文件,其中包含多个事务类型,我只关心3个事务类型(121122124) 示例文件: D103421612100188300000000000001200000200001000032021420170012260214201700122600000005950000300001025798 D10342161220018830000000000000110000000000000000120537000282000040170000001024000000011NNYNY0

我有一堆固定宽度的文本文件,其中包含多个事务类型,我只关心3个事务类型(121122124)

示例文件:

D103421612100188300000000000001200000200001000032021420170012260214201700122600000005950000300001025798 D10342161220018830000000000000110000000000000000120537000282000040170000001024000000011NNYNY000010000030000000000 D103421612400188300000000000001000000000100000000000000000000CS00000000001200000033NN00000001200

所以我需要做的是从这些文件中逐行读取,并查找在startIndex=9和length=3处有121、122或124的文件

每一行都需要根据我拥有的数据字典进行解析,输出需要按事务类型分组到三个不同的文件中

我有一个有效的程序,但效率很低,基本上每行读3遍。我的代码是这样的:

@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提出了一种潜在的解决方法。我将通过以下方式扩展解决方案以满足您的需求:

  • 读取整个文件,添加一个新列,帮助您识别事务类型
  • 在上一步中创建的列上使用带有特定事务类型(121、122、124)的WHERE语句创建3个行集(每个文件一个)
  • 将上一步中创建的每个行集输出到各自的文件中

  • 如果您有更多反馈或需求,请随时在我们的UserVoice网站上创建项目(并为其他人投票)。谢谢

    请注意,此功能将在本月进行私人预览。如果您对测试感兴趣,请随时联系我。请注意,此功能将在本月进行私人预览。如果您对测试感兴趣,请随时联系我