【问题标题】:How to efficiently read the data lake files' metadata [duplicate]如何有效地读取数据湖文件的元数据 [重复]
【发布时间】:2021-06-16 15:26:44
【问题描述】:

我想在数据块脚本中读取数据湖中文件的最后修改日期时间。如果我在从数据湖中读取数据时可以将其作为一列有效地读取,那将是完美的。
谢谢:)

【问题讨论】:

  • @Srinivas 感谢您的评论。我仅限于使用 pyspark 和 dbutils.fs.ls,它给出了一些关于文件的元数据,不包含最后修改的日期时间,只包含文件大小和路径。你碰巧知道我如何在 pyspark 中复制你的逻辑吗?
  • 查看链接答案

标签: azure apache-spark pyspark databricks azure-data-lake-gen2


【解决方案1】:

关于问题,请参考以下代码

URI = sc._gateway.jvm.java.net.URI
Path = sc._gateway.jvm.org.apache.hadoop.fs.Path
FileSystem = sc._gateway.jvm.org.apache.hadoop.fs.FileSystem
conf = sc._jsc.hadoopConfiguration()

conf.set(
  "fs.azure.account.key.<account-name>.dfs.core.windows.net",
  "<account-access-key>")

fs = Path('abfss://<container-name>@<account-name>.dfs.core.windows.net/<file-path>/').getFileSystem(sc._jsc.hadoopConfiguration())

status=fs.listStatus(Path('abfss://<container-name>@<account-name>.dfs.core.windows.net/<file-path>/'))

for i in status:
  print(i)
  print(i.getModificationTime())

【讨论】:

    【解决方案2】:

    我们可以使用 Python 代码获取这些详细信息,因为我们没有直接的方法来获取数据湖中文件的修改时间和日期

    这里是代码

    from pyspark.sql.functions import col
    from azure.storage.blob import BlockBlobService
    from datetime import datetime
    import os.path
    
    block_blob_service = BlockBlobService(account_name='account-name', account_key='account-key')
    container_name ='container-firstname'
    second_conatainer_name ='container-Second'
    #block_blob_service.create_container(container_name)
    generator = block_blob_service.list_blobs(container_name,prefix="Recovery/")
    report_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    
    
    for blob in generator:
        length = BlockBlobService.get_blob_properties(block_blob_service,container_name,blob.name).properties.content_length
        last_modified = BlockBlobService.get_blob_properties(block_blob_service,container_name,blob.name).properties.last_modified
        file_size = BlockBlobService.get_blob_properties(block_blob_service,container_name,blob.name).properties.content_length
        line = container_name+'|'+second_conatainer_name+'|'+blob.name+'|'+ str(file_size) +'|'+str(last_modified)+'|'+str(report_time)
        print(line)
    

    更多详情,请参阅解决类似问题的SO 线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 2021-03-15
      • 2018-11-26
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多