u-sql 无法处理 null

u-sql fails to handle null

我正在试用 azure datalake,并尝试在我的测试文件上测试 u-sql。

这是我的测试脚本

@input =
    EXTRACT TagName     string,
            time        DateTime,
            valuee      float,
            Quality     int
    FROM "/MCVD/{*}/{*}/{*}/{*}/{*}/{*}/{*}.csv"
    USING Extractors.Csv(skipFirstNRows:1, nullEscape:"");

OUTPUT @input
    TO "/output/Test-query.csv"
    USING Outputters.Csv();

当 运行 在数据湖分析中时,我在第 56 行的列值出现错误。

这是第56行的内容

"M32_Amp_FurnaceAluTemperatureTubeReference",2018-02-08T14:48:53.5780000,"",1

我知道这是因为保存值的列是空的(它是文件中的第一个空行)。我尝试使用各种 NullEscape 模式,但它仍然失败。

我尝试将列提取为字符串,但没有产生任何错误。

这是错误:

Vertex failed
Vertex failure triggered quick job abort. Vertex failed: SV1_Extract[0][0] with error: Vertex user code error.
 VertexFailedFast: Vertex failed with a fail-fast error
 E_RUNTIME_USER_EXTRACT_ROW_ERROR: Error occurred while extracting row after processing 56 record(s) in the vertex' input split. Column index: 2, column name: 'valuee'.
 E_RUNTIME_USER_EXTRACT_COLUMN_CONVERSION_EMPTY_ERROR: Failure when attempting to convert empty column data.

U-SQL支持nullable data-types。只需在数据类型后用问号标记它们,例如

@input =
    EXTRACT TagName     string,
            time        DateTime,
            valuee      float?,
            Quality     int
    FROM [your input path]
    USING Extractors.Csv(skipFirstNRows:1, silent:true);

您还可以通过将提取器的 silent 开关设置为 true 来抑制错误行。但是,我在您的脚本和示例数据中遇到了一些不同的错误。这是准确的重现吗?

从文件中的值为 "null"(不带引号)的 csv 中提取时,我遇到了同样的错误。我预计 nullEscape 参数的默认空值将处理提取,但它引发了空值转换错误。

这可能是因为我的 csv 没有双引号作为引用。

使用 nullEscape:"null" 参数解决了我的问题。