从 U-SQL 上的特定文件读取
Reading from specific files on U-SQL
我是 U-SQL 的新手,已经开始查询文件了。根据我在文档和堆栈溢出上看到的说明,我编写了一个查询,用于从一组 json 文件中提取元数据,如下所示。
REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];
USING Microsoft.Analytics.Samples.Formats.Json;
DECLARE @InputFile string = "/test/{*}.json";
DECLARE @OutputFile string = "/metadata.csv";
@json =
EXTRACT
id string,
date DateTime,
type string,
uri = FILE.URI()
, modified_date = FILE.MODIFIED()
, created_date = FILE.CREATED()
, file_sz = FILE.LENGTH()
FROM
@InputFile
USING new JsonExtractor();
@json2 =
SELECT
uri
modified_date,
created_date,
file_sz
FROM @json;
@json3 =
SELECT DISTINCT uri,
modified_date,
created_date,
file_sz
FROM @json2;
OUTPUT @json3
TO @OutputFile
USING Outputters.Csv(outputHeader:true,quoting:true);
DROP ASSEMBLY [Newtonsoft.Json];
DROP ASSEMBLY [Microsoft.Analytics.Samples.Formats];
这会生成所需的元数据(我 运行 这在 Azure 门户上,即使这里的位置是相对的)
我的问题是:
1) 我们如何使用来自内部 table / 文件的一列(一列文件名)的值作为输入的文件路径列表?
2) 我们如何将新数据附加到现有文件并使用新文件列表更新元数据文件。
我的元数据如下所示:
uri created_date modified_date file_sz
/…/abc.json 09-22-2018 09-23-2018 250
/…/del.json 09-24-2018 09-24-2018 126
预期输出(如果可能)
@filespresent =
SELECT uri
FROM @metadata
DECLARE @Inputfile string = @filespresent
这样做的主要目的是我每天都会收到一批新文件,我只想阅读今天上传的文件。
文件名不包含日期,我可以从文件内部提取日期信息的唯一方法。我在单独的查询中提取元数据,然后 运行 从元数据文件中选择的文件的主要工作。
如果有其他解决方法,也非常欢迎。
感谢任何帮助。
这是目前的限制。你可以投票here for that feature. Also stated here the same .
解决这个问题的唯一方法是 运行 u-sql 脚本,它带有 powershell,可以像这样注入外部变量:
DECLARE EXTERNAL @InputFile string = "/Input/sample{n}.json";
如果您尝试 运行 这样做,您会得到 "Rowset variable is not a scalar variable"...
的错误
REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];
USING Microsoft.Analytics.Samples.Formats.Json;
DECLARE @InputFile string = "/Input/sample4.json";
DECLARE @OutputFile1 string = "/Output/metadata1.csv";
DECLARE @OutputFile2 string = "/Output/metadata2.csv";
DECLARE @OutputFile3 string = "/Output/metadata3.csv";
@json1 =
EXTRACT
// Json fields
id string,
file string,
// Virtual columns
n string,
uri = FILE.URI()
, modified_date = FILE.MODIFIED()
, created_date = FILE.CREATED()
, file_sz = FILE.LENGTH()
FROM
@InputFile // This file has a file set within
USING new JsonExtractor();
OUTPUT @json1
TO @OutputFile1
USING Outputters.Csv(outputHeader:true,quoting:true);
@json2 =
SELECT
file
FROM @json1;
OUTPUT @json2
TO @OutputFile2
USING Outputters.Csv(outputHeader:true,quoting:true);
@json3 =
EXTRACT
// Json fields
id string,
file string,
// Virtual columns
n string,
uri = FILE.URI()
, modified_date = FILE.MODIFIED()
, created_date = FILE.CREATED()
, file_sz = FILE.LENGTH()
FROM
@json2 // This is a rowset variable (with our fileset)
USING new JsonExtractor();
OUTPUT @json3
TO @OutputFile3
USING Outputters.Csv(outputHeader:true,quoting:true);
您想要的功能(例如,从文件中读取路径并附加到现有文件)不可用。
您可以通过读取文件、合并新数据然后将结果写入同一个文件来附加到文件。
但是,通过查看您的场景**这样做的主要目的是我每天都会收到一批新文件,并且我只想读取今天上传的文件。 **
您可以像上面那样做 EXTRACT
,然后在 created_date
或 modified_date
列上放置一个过滤器,以仅 select 创建或修改的文件具体日期。例如。 (输入计算器),
DECLARE EXTERNAL @last_processed_modified_date = DateTime.Now();
@json = EXTRACT
id string,
date DateTime,
type string,
uri = FILE.URI()
, modified_date = FILE.MODIFIED()
, created_date = FILE.CREATED()
, file_sz = FILE.LENGTH()
FROM @InputFile
USING new JsonExtractor();
@json = SELECT * FROM @json WHERE modified_date > @last_processed_modified_date;
…
我是 U-SQL 的新手,已经开始查询文件了。根据我在文档和堆栈溢出上看到的说明,我编写了一个查询,用于从一组 json 文件中提取元数据,如下所示。
REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];
USING Microsoft.Analytics.Samples.Formats.Json;
DECLARE @InputFile string = "/test/{*}.json";
DECLARE @OutputFile string = "/metadata.csv";
@json =
EXTRACT
id string,
date DateTime,
type string,
uri = FILE.URI()
, modified_date = FILE.MODIFIED()
, created_date = FILE.CREATED()
, file_sz = FILE.LENGTH()
FROM
@InputFile
USING new JsonExtractor();
@json2 =
SELECT
uri
modified_date,
created_date,
file_sz
FROM @json;
@json3 =
SELECT DISTINCT uri,
modified_date,
created_date,
file_sz
FROM @json2;
OUTPUT @json3
TO @OutputFile
USING Outputters.Csv(outputHeader:true,quoting:true);
DROP ASSEMBLY [Newtonsoft.Json];
DROP ASSEMBLY [Microsoft.Analytics.Samples.Formats];
这会生成所需的元数据(我 运行 这在 Azure 门户上,即使这里的位置是相对的)
我的问题是:
1) 我们如何使用来自内部 table / 文件的一列(一列文件名)的值作为输入的文件路径列表?
2) 我们如何将新数据附加到现有文件并使用新文件列表更新元数据文件。
我的元数据如下所示:
uri created_date modified_date file_sz
/…/abc.json 09-22-2018 09-23-2018 250
/…/del.json 09-24-2018 09-24-2018 126
预期输出(如果可能)
@filespresent =
SELECT uri
FROM @metadata
DECLARE @Inputfile string = @filespresent
这样做的主要目的是我每天都会收到一批新文件,我只想阅读今天上传的文件。
文件名不包含日期,我可以从文件内部提取日期信息的唯一方法。我在单独的查询中提取元数据,然后 运行 从元数据文件中选择的文件的主要工作。
如果有其他解决方法,也非常欢迎。
感谢任何帮助。
这是目前的限制。你可以投票here for that feature. Also stated here the same
解决这个问题的唯一方法是 运行 u-sql 脚本,它带有 powershell,可以像这样注入外部变量:
DECLARE EXTERNAL @InputFile string = "/Input/sample{n}.json";
如果您尝试 运行 这样做,您会得到 "Rowset variable is not a scalar variable"...
的错误REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];
USING Microsoft.Analytics.Samples.Formats.Json;
DECLARE @InputFile string = "/Input/sample4.json";
DECLARE @OutputFile1 string = "/Output/metadata1.csv";
DECLARE @OutputFile2 string = "/Output/metadata2.csv";
DECLARE @OutputFile3 string = "/Output/metadata3.csv";
@json1 =
EXTRACT
// Json fields
id string,
file string,
// Virtual columns
n string,
uri = FILE.URI()
, modified_date = FILE.MODIFIED()
, created_date = FILE.CREATED()
, file_sz = FILE.LENGTH()
FROM
@InputFile // This file has a file set within
USING new JsonExtractor();
OUTPUT @json1
TO @OutputFile1
USING Outputters.Csv(outputHeader:true,quoting:true);
@json2 =
SELECT
file
FROM @json1;
OUTPUT @json2
TO @OutputFile2
USING Outputters.Csv(outputHeader:true,quoting:true);
@json3 =
EXTRACT
// Json fields
id string,
file string,
// Virtual columns
n string,
uri = FILE.URI()
, modified_date = FILE.MODIFIED()
, created_date = FILE.CREATED()
, file_sz = FILE.LENGTH()
FROM
@json2 // This is a rowset variable (with our fileset)
USING new JsonExtractor();
OUTPUT @json3
TO @OutputFile3
USING Outputters.Csv(outputHeader:true,quoting:true);
您想要的功能(例如,从文件中读取路径并附加到现有文件)不可用。
您可以通过读取文件、合并新数据然后将结果写入同一个文件来附加到文件。
但是,通过查看您的场景**这样做的主要目的是我每天都会收到一批新文件,并且我只想读取今天上传的文件。 **
您可以像上面那样做 EXTRACT
,然后在 created_date
或 modified_date
列上放置一个过滤器,以仅 select 创建或修改的文件具体日期。例如。 (输入计算器),
DECLARE EXTERNAL @last_processed_modified_date = DateTime.Now();
@json = EXTRACT
id string,
date DateTime,
type string,
uri = FILE.URI()
, modified_date = FILE.MODIFIED()
, created_date = FILE.CREATED()
, file_sz = FILE.LENGTH()
FROM @InputFile
USING new JsonExtractor();
@json = SELECT * FROM @json WHERE modified_date > @last_processed_modified_date;
…