【问题标题】:Parquet file after upload to Azure Data Lake gen 2 not readable (Python)上传到 Azure Data Lake gen 2 后 Parquet 文件不可读(Python)
【发布时间】:2021-05-04 08:59:26
【问题描述】:

你好 stackoverflow 社区,

我在读取镶木地板文件时遇到了一些问题。在我使用 Python 将 Parquet 文件上传到 Azure Data Lake gen 2 后,问题就开始了。

我使用的是微软官方文档:https://docs.microsoft.com/en-us/azure/storage/blobs/data-lake-storage-directory-file-acl-python

除了认证,这部分:

def upload_file_to_directory():
try:



    file_system_client = service_client.get_file_system_client(file_system="my-file-system")



    directory_client = file_system_client.get_directory_client("my-directory")
    
    file_client = directory_client.create_file("uploaded-file.txt")
    local_file = open("C:\\file-to-upload.txt",'r')



    file_contents = local_file.read()



    file_client.append_data(data=file_contents, offset=0, length=len(file_contents))



    file_client.flush_data(len(file_contents))



except Exception as e:
  print(e)

当我使用代码上传一个小的 csv 文件时,它工作得很好。 csv 文件已上传,当我下载文件时,我可以毫无问题地打开它。

如果我将相同的数据框转换为一个小的 parquet 文件并上传该文件,则上传工作正常。但是当我下载文件并尝试打开它时,我收到错误消息:

ArrowInvalid:在页脚中找不到 Parquet 魔术字节。文件已损坏,或者这不是 parquet 文件。

如果我直接读取 Parquet 字段而不上传,它可以正常工作。

有没有人建议我如何修改代码以免破坏我的镶木地板文件?

谢谢!

【问题讨论】:

    标签: python pandas dataframe parquet azure-data-lake


    【解决方案1】:

    我不确定你的代码有什么问题(你的代码似乎不完整),你可以试试这个代码,它对我有用:

    try:
        file_system_client = service_client.get_file_system_client(file_system="my-file-system")
    
        directory_client = file_system_client.get_directory_client("my-directory")
    
        file_client = directory_client.create_file("data.parquet")
    
        df = pd.DataFrame({'one': [-1, np.nan, 2.5],
                           'two': ['foo', 'bar', 'baz'],
                           'three': [True, False, True]},
                          index=list('abc')).to_parquet()
    
        file_client.append_data(data=df, offset=0, length=len(df))
    
        file_client.flush_data(len(df))
    
    except Exception as e:
        print(e)
    

    【讨论】:

      【解决方案2】:

      我今天刚刚在我的项目中解决了这个错误。

      我正在使用pyarrow.parquet.write_table 来编写我的 Parquet 文件。

      我将本机 Python 文件对象传递给 where 参数,不知何故导致页脚永远不会被写入。

      当我切换到使用 PyArrow output streams 而不是本机 Python 文件对象时,页脚在流关闭时正确写入,这为我解决了这个问题。

      【讨论】:

        猜你喜欢
        • 2019-09-23
        • 2020-01-19
        • 2023-03-04
        • 2021-03-26
        • 2020-11-22
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多