我正在编写一个Azure函数,将文件从AWS S3移动到Azure Datalake,下载工作正常,上传工作正常,但我很难将两者结合起来,因为我不想将文件存储在中间应用程序中,也就是说,Azure函数本身不需要存储文件,只需将其传递。
解释起来并不容易,所以请耐心听我解释一下我想做什么。
当我用这个代码从S3下载时
await client.GetObjectAsync(new GetObjectRequest { BucketName = bucketName, Key = entry.Key });
我没有一个文件系统来存储它,我不想存储它,我希望它是某种“对象”,我可以直接传递给azure data lake writer,如下所示
adlsFileSystemClient.FileSystem.UploadFile(adlsAccountName, source, destination, 1, false, true);
如果我将其下载到本地磁盘,然后将其上载,代码就可以正常工作,但这不是我想要的,因为azure函数没有存储空间,所以我想将下载的对象直接传递给上载程序
我该如何实现这一点?
****编辑****
// Process the response.
foreach (S3Object entry in response.S3Objects)
{
Console.WriteLine("key = {0} size = {1}", entry.Key.Split('/').Last(), entry.Size);
string fileNameOnly = entry.Key.Split('/').Last();
//await client.GetObjectAsync(new GetObjectRequest { BucketName = bucketName, Key = entry.Key });
GetObjectResponse getObjRespone = await client.GetObjectAsync(bucketName, entry.Key);
MemoryStream stream = new MemoryStream();
getObjRespone.ResponseStream.CopyTo(stream);
if (entry.Key.Contains("MerchandiseHierarchy") == true)
{
WriteToAzureDataLake(stream, @"/PIMRAW/MerchandiseHierarchy/" + fileNameOnly);
}
}
然后我将内存流传递给azure方法,但我需要一个streamuploader,我无法fid它,下面的抱怨是它无法将流转换为字符串
adlsFileSystemClient.FileSystem.UploadFile(adlsAccountName, source, destination, 1, false, true);
*编辑2*
更改上传方法如下,它在目的地创建文件,但大小为0,所以我想知道我是否在下载完成之前创建?
static void WriteToAzureDataLake(MemoryStream inputSource, string inputDestination)
{
// 1. Set Synchronization Context
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
// 2. Create credentials to authenticate requests as an Active Directory application
var clientCredential = new ClientCredential(clientId, clientSecret);
var creds = ApplicationTokenProvider.LoginSilentAsync(tenantId, clientCredential).Result;
// 2. Initialise Data Lake Store File System Client
adlsFileSystemClient = new DataLakeStoreFileSystemManagementClient(creds);
// 3. Upload a file to the Data Lake Store
//var source = @"c:\nwsys\source.txt";
var source = inputSource;
//var destination = "/PIMRAW/MerchandiseHierarchy/destination.txt";
var destination = inputDestination;
//adlsFileSystemClient.FileSystem.UploadFile(adlsAccountName, source, destination, 1, false, true);
adlsFileSystemClient.FileSystem.Create(adlsAccountName, destination, source);
// FINISHED
Console.WriteLine("6. Finished!");
}
我正在使用Guava缓存热数据。当缓存中不存在数据时,我必须从数据库中获取数据: 我的问题是当数据不存在于数据库中时,我希望它返回并且不做任何缓存。但Guava保存与缓存中的关键字,并抛出一个异常,当我得到它: com.google.common.cache.CacheLoader$InvalidCacheLoadExcION: CacheLoader为shisoft键返回null。 我们如何避免
我相当愚蠢地上传了一个vhd到Azure文件存储,以为我可以从它创建一个虚拟机,却发现它真的需要在Blob存储中。 我知道我可以再上传一次,但它非常大,我的上传速度非常慢。 我的问题是-我可以将文件从文件存储移动到blob存储,而无需再次下载/上传吗?也就是说,Azure门户UI中是否有任何东西可以执行此操作,甚至是PowerShell命令?
我在数据库中创建了一个连接到我的blob存储的挂载,并且我能够使用笔记本将文件从blob读取到数据库。 然后我使用pyspark将. txt转换为json格式,现在我想将其加载回blob存储。有人知道我会怎么做吗? 以下是我尝试过的一些事情: <code>my_json.write。选项(“header”,“true”).json(“mnt/my_mount/file_name.json”) <
我有一个分布式任务队列,其中的任务如下所示: 这里有一个竞争条件:如果任务队列软件在完全相同的时间启动其中两个任务,它们都将从数据库中获得相同的<code>old_path</code>,并且竞争失败者的取消链接调用失败(将失败者的新路径从未来的取消链接中孤立出来)。 有没有办法让我构建它来绕过这场比赛?如果需要,我可以从当前设计中抛出几乎任何东西。具体来说,我使用的是PostgreSQL,Pyt
早些时候,我的文件上载到存储文件夹中。但是现在我想在s3存储桶上上传图像。如何迁移s3存储桶上现有的本地数据? 我在这里找到了脚本https://www.stefanwienert.de/blog/2018/11/05/active-storage-migrate-between-providers-from-local-to-amazon/但是得到了一个错误 为活动存储调用私有方法打开 那么,我
我有一个脚本,它每天运行并保存一个带有每日时间戳的CSV文件,下面是AWS CLI命令,用于将文件移动到S3存储桶,然后从我使用的源代码中将其删除。 我想使用Cron作业自动将文件每天移动到S3桶。如何在AWS CLI命令中创建文件名变量?