无法使用U-SQL读取Excel文件

时间:2018-10-23 07:58:37

标签: azure azure-data-factory u-sql

我正在尝试读取Excel文件,并且必须在Azure Datalake中写入一个csv文件。 当我尝试这样做时,它显示错误。

U-SQL脚本:

DECLARE @ExcelFile = @"/Output/demog_data_Merged_08022017.xlsx";

@result01 = EXTRACT Id string,
UNIQUE_ID long,
SOL_ID int,
EMAIL_ID string,
mobilenumber string,
CUST_OPN_DATE DateTime,
gender char,
age int,
CUR_CITY string,
CUR_COUNTRY string,
CUR_PIN string,
NRE_CNTRY string,
MARITAL_STATUS char,
FREZ_CODE char,
UNFREEZ_DATE DateTime,
LAST_FREZ_DATE DateTime,
DORMANCY_STATUS char,
AVAILABLE_AMOUNT double,
ACCOUNT_OPEN_DATE DateTime,
nullcol string,
Salaried_account_flag char,
ACCOUNT_TYPE string
FROM @ExcelFile
USING new oh22is.Analytics.Formats.ExcelExtractor("result01");


@result02 = SELECT * FROM @result01;

OUTPUT @result02 TO "/output/demog_for_report.csv"
USING Outputters.Csv();

错误:

{
    "errorCode": "2703",
    "message": "Error Id: E_CSC_USER_INVALIDCSHARP, Error Message: C# error CS0246: The type or namespace name 'oh22is' could not be found (are you missing a using directive or an assembly reference?). ",
    "failureType": "UserError",
    "target": "U-SQL1"
}

1 个答案:

答案 0 :(得分:0)

如果没有程序集引用,则无法读取Excel文件。您需要在数据湖目录中包含文件DocumentFormat.OpenXml.dlloh22is.Analytics.Formats.dll,以及excel文件(不一定在同一文件夹中)。

程序集引用拥有文件读取逻辑,并充当u-sql内部数据表示形式与文件格式之间的网关,从而产生可以处理的数据。

据我所知,这些文件没有单独分发,Microsoft似乎要求您使用from sourcethis repository在Visual Studio中手动进行编译。使用VS的好处是,您可以直接引用程序集以加快开发速度(但是我发现它没有意义,因为我仅将其用于excel提取,并且只需要生成一次文件)。编译过程还应该为您提供documentformat.openxml package中的动态链接库,这样您就不必下载它或从.nupkg文件中提取它了,如果您确实更喜欢使用/lib/net40/DocumentFormat.OpenXml.dll上的版本,该版本适用于我的xlsx文件(2007-2019格式)。

将程序集文件(两个.dll文件)放入数据湖后,记下它们的路径,并像以下u-sql脚本一样使用它们:

// Register the dependency to the analytics assembly (xml file reader)
DROP ASSEMBLY IF EXISTS openxml;
CREATE ASSEMBLY openxml FROM @"/MyProject/Assemblies/DocumentFormat.OpenXml.dll";
REFERENCE ASSEMBLY openxml;

// Register the analytics assembly that read our excel file
DROP ASSEMBLY IF EXISTS analytics;
CREATE ASSEMBLY analytics FROM @"/MyProject/Assemblies/oh22is.Analytics.Formats.dll";
REFERENCE ASSEMBLY analytics;

// Define a local variable for the excel file
DECLARE @ExcelFile = @"/MyProject/MyFolder/test-file.xlsx";

@sheet = EXTRACT
    A string,
    B string,
    C string
FROM @ExcelFile
    USING new oh22is.Analytics.Formats.ExcelExtractor("Sheet1");

//And you can save, transform, select it like you would use any other data:

OUTPUT (SELECT * FROM @sheet) TO "/MyProject/output.csv" USING Outputters.Csv();