【问题标题】:u-sql script can not obtain scalar value from datasetu-sql 脚本无法从数据集中获取标量值
【发布时间】:2018-02-06 12:01:47
【问题描述】:

在 u-sql 脚本中,我必须从文件中提取变量到数据集,然后使用它来形成输出文件的名称。如何从数据集中获取变量?

详细说明。

我有 2 个输入文件:带有一组字段的 csv 文件和一个字典文件。第一个文件的文件名类似于 ****ClintCode*****.csv。第二个文件字典有 2 个映射字段:ClientCode - ClintCode2。我的任务是从文件名中提取 ClientCode 值,从字典中获取 ClientCode2,将其作为字段插入到输出文件(已实现),此外,将输出文件的名称形成为 ****ClientCode2****。 .csv。

字典 csv 文件有以下内容:

旧代码新代码

6HAA 阿尔法

CCVV 测试版

CVXX 伽玛

?戴维斯

问题是如何将ClientCode2变成标量变量来为输出文件写表达式?

DECLARE @inputFile string = "D:/DFS_SSC_Automation/Tasks/FundInfo/ESP_FAD_GL_6HAA_20170930.txt";  // '6HAA' is ClientCode here that mapped to other code in ClientCode_KVP.csv

DECLARE @outputFile string = "D:/DFS_SSC_Automation/Tasks/FundInfo/ClientCode_sftp_" +   // 'ClientCode' should be replaced with ClientCode from mapping in ClientCode_KVP.csv
                            DateTime.Now.ToString("yyyymmdd") + "_" +
                            DateTime.Now.ToString("HHmmss") + ".csv";

DECLARE @dictionaryFile string = "D:/DFS_SSC_Automation/ClientCode_KVP.csv";


@dict =
    EXTRACT [OldCode] string,
            [NewCode] string
    FROM @dictionaryFile
    USING Extractors.Text(skipFirstNRows : 1, delimiter : ',');

@theCode =
    SELECT Path.GetFileNameWithoutExtension(@inputFile).IndexOf([OldCode]) >= 0 ? 1 : 3 AS [CodeExists],
           [NewCode]
    FROM @dict
    UNION
    SELECT *
    FROM(
        VALUES
        (
            2,
            ""
        )) AS t([CodeExists],[NewCode]);

@code =
    SELECT [NewCode]
    FROM @theCode
ORDER BY [CodeExists]
FETCH 1 ROWS;


@GLdata = 
    EXTRACT [ASAT] string,
    [ASOF] string,
    [BASIS_INDICATOR] string,
    [CALENDAR_DATE] string,
    [CR_EOP_AMOUNT] string,
    [DR_EOP_AMOUNT] string,
    [FUND_ID] string,
    [GL_ACCT_TYPE_IND] string,
    [TRANS_CLIENT_FUND_NUM] string
FROM @inputFile
USING Extractors.Text(delimiter : '|', skipFirstNRows : 1);

// Prepare output dataset

@FundInfoGL =
    SELECT "" AS [AccountPeriodEnd],
           "" AS [ClientCode],
           [FUND_ID] AS [FundCode],
           SUM(GL_ACCT_TYPE_IND == "A"? System.Convert.ToDecimal(DR_EOP_AMOUNT) : 0) AS [NetValueOtherAssets],
           SUM(GL_ACCT_TYPE_IND == "L"? System.Convert.ToDecimal(CR_EOP_AMOUNT) : 0) AS [NetValueOtherLiabilities],
           0.0000 AS [NetAssetsOfSeries]
    FROM @GLdata
    GROUP BY FUND_ID;


// NetAssetsOfSeries calculation

@FundInfoGLOut =
    SELECT [AccountPeriodEnd],
           [NewCode] AS [ClientCode],
           [FundCode],
           Convert.ToString([NetValueOtherAssets]) AS [NetValueOtherAssets],
           Convert.ToString([NetValueOtherLiabilities]) AS [NetValueOtherLiabilities],
           Convert.ToString([NetValueOtherAssets] - [NetValueOtherLiabilities]) AS [NetAssetsOfSeries]
    FROM @FundInfoGL
    CROSS JOIN @code;


// Output

OUTPUT @FundInfoGLOut
TO @outputFile
USING Outputters.Text(outputHeader : true, delimiter : '|', quoting : false);

【问题讨论】:

  • 你尝试过什么吗?如果是,请发布该代码。
  • 什么数据集?什么变量?什么输出文件?显示一些关于你正在尝试做什么的信息。这太模糊了。
  • 嗨@OksanaMikolenko,您能否编辑问题而不是在 cmets 中发布详细信息?这使它具有更好的可读性。您是否也可以发布 u-sql 代码,以便我们查看您的尝试并帮助您解决问题?

标签: u-sql


【解决方案1】:

正如 David 指出的那样:您不能将查询结果分配给标量变量。

不过,我们现在在私人预览版中提供动态分区输出功能,让您能够根据列值生成文件名。如果您想试用,请与我联系。

【讨论】:

  • 嗨@MichaelRys,谢谢你,但我在你的个人资料中找不到任何我想写信给你的电子邮件。如果您给我发电子邮件至 oksana.mikolenko@gmail.com 或提供一些联系方式,我将不胜感激。
【解决方案2】:

你不能。请参阅Convert Rowset variables to scalar value

您可能仍然能够以不同的方式实现您的最终目标。请考虑使用清晰简洁的语言、小型数据集、预期输出和极少量的代码来重新编写您的帖子 - 删除创建测试用例不需要的所有细节和细微差别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多