Azure Data Lake Analytics IOutputter 获取输出文件名
Azure Data Lake Analytics IOutputter get output file name
我正在使用自定义 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)
{
}
}
是否有可能将 "databasefile.database" 替换为指定的输出文件路径“/path/somefilename_{*}.file”?
因为我无法将 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();
}
}
}
我不确定你想达到什么目的。
输出器(和一般的 UDO)在 ADLA 中执行时不能离开它们的容器(VM)(此时本地执行没有这样的限制)。因此,连接到容器外部的数据库将被阻止,我不确定将数据临时写入数据库有什么帮助VM/container。
UDO 模型有一个定义明确的模型,通过将 input
行(集)中的数据写入 output
的流。您可以写入本地文件,但同样,这些文件将在顶点执行完成后不复存在。
根据这些信息,你能改一下吗?
根据澄清评论更新
您有两个选项可以从行集生成数据库:
- 您使用 ADF 进行数据移动。这是最常用的方法,也可能是最简单的方法。
- 如果您使用自定义输出器,您可以尝试以下操作:
- 使用数据库接口将输出行集写入顶点本地的数据库(您必须将数据库部署为资源,因此您可能需要占用空间小的版本以适应资源大小限制),
- 然后将数据库文件从顶点本地目录读取到输出流中,以便将文件复制到 ADLS 中。
- 请注意,您需要在输出器上进行原子文件处理,以避免写入许多数据库文件然后拼接在一起。
我正在使用自定义 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)
{
}
}
是否有可能将 "databasefile.database" 替换为指定的输出文件路径“/path/somefilename_{*}.file”?
因为我无法将 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();
}
}
}
我不确定你想达到什么目的。
输出器(和一般的 UDO)在 ADLA 中执行时不能离开它们的容器(VM)(此时本地执行没有这样的限制)。因此,连接到容器外部的数据库将被阻止,我不确定将数据临时写入数据库有什么帮助VM/container。
UDO 模型有一个定义明确的模型,通过将
input
行(集)中的数据写入output
的流。您可以写入本地文件,但同样,这些文件将在顶点执行完成后不复存在。
根据这些信息,你能改一下吗?
根据澄清评论更新
您有两个选项可以从行集生成数据库:
- 您使用 ADF 进行数据移动。这是最常用的方法,也可能是最简单的方法。
- 如果您使用自定义输出器,您可以尝试以下操作:
- 使用数据库接口将输出行集写入顶点本地的数据库(您必须将数据库部署为资源,因此您可能需要占用空间小的版本以适应资源大小限制),
- 然后将数据库文件从顶点本地目录读取到输出流中,以便将文件复制到 ADLS 中。
- 请注意,您需要在输出器上进行原子文件处理,以避免写入许多数据库文件然后拼接在一起。