Azure Data Lake Analytics IOutputer获取输出文件名



我使用自定义IOutputer将U-SQL脚本的结果写入本地数据库:

OUTPUT @dataset
TO "/path/somefilename_{*}.file"
USING new CustomOutputter()
public class CustomOutputter: IOutputter
{          
public CustomOutputter()
{
myCustomDatabase.Open("databasefile.database");
}    
public override void Output(IRow input, IUnstructuredWriter output)
{
}
}

是否有可能将"databasefile.database"替换为指定的输出文件路径"/path/somefilename_{*}.file"?

由于我无法将output.BaseStream传递到数据库,我找不到正确写入文件名的方法。

更新如何将本地DB文件复制到ADLA提供的输出流:

public override void Close()
{
using (var fs = File.Open("databasefile.database", FileMode.Open))
{
byte[] buffer = new byte[65536];
int read;
while ((read = fs.Read(buffer, 0, buffer.Length)) > 0)
{
this.output.BaseStream.Write(buffer, 0, read);
this.output.BaseStream.Flush();
}
}
}

我不确定你想要实现什么。

  1. 在ADLA中执行时,输出(以及通常的UDO)不能离开其容器(VM)(本地执行在这一点上没有这样的限制)。因此,连接到容器外的数据库将被阻止,我不确定将数据写入瞬态VM/容器中的数据库有什么帮助。

  2. UDO模型有一个定义良好的模型,可以通过将input行(集合)中的数据写入output的流来写入ADLS或WASB中的文件。您可以写入本地文件,但同样,在顶点完成执行后,这些文件将不存在。

鉴于这些信息,你能重新措辞吗?

基于澄清评论的更新

有两个选项可以从行集生成数据库:

  1. 使用ADF进行数据移动。这是最常用的方法,可能也是最简单的方法
  2. 如果您使用自定义输出程序,您可以尝试以下操作:
    1. 使用数据库接口将输出行集写入顶点本地的数据库(您必须将数据库部署为资源,因此您可能需要一个小封装版本来适应资源大小限制)
    2. 然后将数据库文件从顶点本地目录读取到输出流中,以便将文件复制到ADLS中
    3. 请注意,您需要对输出程序进行原子文件处理,以避免编写许多数据库文件,然后将这些文件缝合在一起

最新更新