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

时间:2017-01-08 12:47:34

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

我正在使用自定义IOutputter将我的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)
        {

        }
}

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

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

更新我如何将本地数据库文件复制到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 个答案:

答案 0 :(得分:1)

我不确定你想要达到的目的。

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

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

  3. 鉴于这些信息,请你改写一下吗?

    根据澄清评论进行更新

    您有两种方法可以从行集生成数据库:

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