当前位置: 首页 > 知识库问答 >
问题:

当我从AWS移动到Azure DataLake时,如何避免存储此文件?

苏建安
2023-03-14

我正在编写一个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!");

        }

共有1个答案

鲜于德业
2023-03-14

更改上传方法如下,它将在目标处创建文件,但大小为0

在写入datalake之前,似乎需要将流位置设置为0。

stream.Position = 0;
 类似资料:
  • 我正在使用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命令中创建文件名变量?