【问题标题】:How to access captured data from Event Hub in Azure Data Lake Storage Gen2 using Python如何使用 Python 从 Azure Data Lake Storage Gen2 中的事件中心访问捕获的数据
【发布时间】:2020-07-19 17:21:28
【问题描述】:

我正在使用 connection_string 访问 Azure Data Lake Gen2 存储,其中大量 Avro 文件由事件中心捕获存储在包含按年/月/日/小时/分钟命名的文件夹的典型目录结构下.我正在使用 azure.storage.filedatalake 包。

首先我得到一个数据湖服务客户端使用:

datalake_service_client = DataLakeServiceClient.from_connection_string(connection_string)

然后我通过以下方式获取湖中的文件系统:

file_systems = datalake_service_client.list_file_systems()
for file_system in file_systems:
    print(file_system.name)

在这种情况下只有一个文件系统,称为“datalake1”。此时我想访问我希望在其中找到的所有 Avro 文件。我正在尝试首先获取文件系统客户端:

file_system_client = datalake_service_client.get_file_system_client("datalake1")

然后使用 get_paths 方法:

file_system_client.get_paths()

它返回一个迭代器(azure.core.paging.ItemPaged 对象),但从这里我无法看到文件夹和文件。我尝试使用像[x.name for x in file_system_client.get_paths()] 这样的简单列表理解,但出现错误StorageErrorException:操作返回无效状态'指定的容器不存在。'

您知道如何按照此过程访问 Avro 文件吗?

编辑:我使用的是 azure-storage-file-datalake 版本 12.0.0。下面是代码截图:

谢谢

【问题讨论】:

    标签: azure azure-blob-storage azure-data-lake azure-eventhub azure-sdk-python


    【解决方案1】:

    问题出在连接字符串上。我再次尝试,但从 Azure 门户中的“访问密钥”刀片中获取它,现在它工作正常。我设法正确运行 get_paths() 等等。先前的连接字符串取自存储资源管理器,它对应于从“共享访问签名”刀片中检索到的连接字符串。感谢@MartinJaffer-MSFT (MSDN)。

    【讨论】:

      【解决方案2】:

      更新:

      用你的代码测试过:


      原答案:

      调用get_paths()方法后,可以使用is_directory属性判断是目录还是文件。如果它是一个文件,那么你可以对它做一些事情。

      示例代码(在这个示例中,我只是打印了.avro文件路径。请随意修改代码以满足您的需要):

      #other code
      paths = file_system_client.get_paths()
      
      for path in paths:
          #determine if it is a directory or a file
          if not path.is_directory:
              #here, just print out the file name.
              print(path.name + '\n')
              #you can do other operations here.
      

      测试结果:

      【讨论】:

      • 我这样做了,但仍然得到同样的错误。我猜你的 eh1 是容器的名称,对吧?在我的例子中,它是 datalake1,我通过 file_systems = datalake_service_client.list_file_systems() 然后 for file_system in file_systems: print(file_system.name) 得到这个名字。上面的错误表明指定的容器不存在,但是如果我运行container = ContainerClient.from_connection_string(connection_string, container_name="datalake1"),然后运行container.list_blobs(),我可以毫无问题地列出所有blob的名称。怎么可能?
      • @datariel,是的,eh1 是容器名称。您的帐户中有多少个容器(文件系统)?我稍后会试一试。
      • @datariel,你能在你的问题中发布完整的代码吗?我做了一个快速测试,没有发生错误,一切都很好。并告诉我您使用的是哪个版本的azure-storage-file-datalake(我使用的是最新版本,12.0.0)。
      • 是的,我也在使用 azure-storage-file-datalake 版本 12.0.0。我将完整代码添加到已编辑的问题中。感谢您的宝贵时间。
      • @datariel,我用你的代码测试了它,没有错误。你能创建一个新的Data Lake Storage Gen2,然后再次运行代码吗?可能和the current ADLS Gen2有关的东西
      猜你喜欢
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 2020-07-21
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多