遇到错误"无法将类型System.Nullable`1 [System.Int64] []转换为R向量"

时间:2018-01-29 15:44:47

标签: r azure-data-lake u-sql data-lake

我试图在Data Lake Store上运行一个工作,但是我收到了一个错误。

我在u-sql脚本中插入了R脚本。

在我的R脚本中,我使用数据集来计算变量的百分位数,作为输出,我创建了一个包含计算结果的数据框。

这是我脚本的一部分:

REFERENCE ASSEMBLY [ExtR]; 
DECLARE @data string = @"/output/model/...";
DECLARE @Model_traffic_percentile_outputfile string = "/output/model/...";
DECLARE @myRScript = @"
prob <- c(0.9999995,0.9999996,0.9999997,0.9999998,0.9999999,1)
values <- quantile(inputFromUSQL$total_bytes, probs = prob, type = 6)
outputToUSQL <- data.frame(values, prob)";

@input = 
EXTRACT [Period] string,
        [H_IMSI_BK] long,
        [H_BTSCarrierExternalCode_BK] long,
        [sum_session_duration] long,
        [sum_session_bytes_in] long,
        [sum_session_bytes_out] long,
        [sum_session_count] long
FROM @data
USING Extractors.Csv(skipFirstNRows:1);

@imsi_traffic_data =
SELECT [H_IMSI_BK],
       SUM(([sum_session_bytes_in] + [sum_session_bytes_out]) * [row_count]) AS [total_bytes]
FROM @input
GROUP BY [H_IMSI_BK];

@ExtendedData =
SELECT [total_bytes] AS Par,
   *
FROM @imsi_traffic_data;

@RScriptOutput = REDUCE @ExtendedData ON Par
  PRODUCE Par, values long, prob float
  READONLY Par
  USING new Extension.R.Reducer(
    command:@myRScript,
    rReturnType:"dataframe",
    stringsAsFactors:false);

OUTPUT @RScriptOutput TO @Model_traffic_percentile_outputfile
  USING Outputters.Csv(outputHeader : true, quoting : false);

但是我收到了这个错误:

描述

Vertex failure triggered quick job abort. Vertex failed: SV2_Aggregate[0] 
with error: Vertex user code error.

详细

Vertex SV2_Aggregate[0].v1 {669A5438-5EFD-437D-906C-F069CCD2C5B4} failed 

Error:
Vertex user code error

exitcode=CsExitCode_StillActive Errorsnippet=

INNERERROR

描述

Unhandled exception from user code: "Cannot convert type 
System.Nullable`1[System.Int64][] to an R vector"
The details includes more information including any inner exceptions and the stack trace where the exception was raised.

有谁知道如何解决这个问题?

由于

2 个答案:

答案 0 :(得分:2)

问题是R脚本无法处理64位数据类型。

要创建输入数据集,我使用了命令setDT(df) df[df$example==names(which(table(df$example) < 3)),example:="replaced"] 默认生成的脚本,在这种情况下,该脚本会自动为数据类型的所有字段分配数据类型Create EXTRACT script,其中包含64位值。

所以我修改了提取脚本以这种方式更改数据类型:

long

在处理可空类型时,我以这种方式修改了脚本:

@InputData = 
    EXTRACT [Period] string,
            [H_IMSI_BK] string,
            [H_BTSCarrierExternalCode_BK] string,
            [sum_session_duration] int,
            [sum_session_bytes_in] double,
            [sum_session_bytes_out] double,
            [sum_session_count] int,
            [row_count] int
    FROM @data
    USING Extractors.Csv(skipFirstNRows:1);

通过这些更改,脚本可以正常工作。

答案 1 :(得分:0)

原因是当前的R集成不支持可空类型。 SUM()运算符返回可为空的类型,因此您会得到类型不匹配错误。

您可以通过将和的结果转换为非可空类型来绕过此问题。例如,尝试

@imsi_traffic_data =
SELECT [H_IMSI_BK],
       (double) SUM(([sum_session_bytes_in] + [sum_session_bytes_out]) * [row_count]) AS [total_bytes]
FROM @input
GROUP BY [H_IMSI_BK];

请注意,我们将在以后刷新R扩展时解决此问题。