代码之家  ›  专栏  ›  技术社区  ›  shantanuo

dask无法读取pandas可以读取的文件

  •  0
  • shantanuo  · 技术社区  · 6 年前

    我有一个csv文件,可以使用pandas访问,但使用dask dataframe失败。 我使用了完全相同的参数,但DASK仍然有错误。

    熊猫用例:

    import pandas as pd
    mycols = ['id', 'tran_id', 'client_id', 'm_text', 'retry', 'tran_date']
    
    df = pd.read_csv('s3://some_bucket/abigd/hed4.csv', 
            sep=',', header=None, names=mycols,  skipinitialspace=True, escapechar='\\',  
                     engine='python', dtype=str )
    

    熊猫产量:

    df.retry.value_counts()
    
    1     2792174
    2      907081
    3      116369
    6        6475
    4        5598
    7        1314
    5        1053
    8         288
    16          3
    13          3
    Name: retry, dtype: int64
    

    DASK代码:

    import dask.dataframe as dd
    from dask.distributed import Client
    client = Client('Dask-Scheduler.local-dask:8786') 
    
    df = dd.read_csv('s3://some_bucket/abigd/hed4.csv', 
            sep=',', header=None, names=mycols,  skipinitialspace=True, escapechar='\\',  
                     engine='python', dtype=str,
            storage_options = {'anon':False, 'key': 'xxx' , 'secret':'xxx'} )
    
    
    df_persisted = client.persist(df)
    
    df_persisted.retry.value_counts().compute()
    

    DASK输出:

    parsererror:意外的数据结尾

    我试过在达斯克打开更小(更大)的文件,但没有问题。此文件可能有未关闭的引用。我看不出dask无法读取文件的任何原因。

    1 回复  |  直到 6 年前
        1
  •  0
  •   mdurant    6 年前

    DASK通过查找行分隔符b“\n”来拆分文件。它在文件的某些部分中查找这个单字节,因此不需要预先读取整个文件。当它发现它不知道字节是转义的还是在引用的范围内。

    因此,dask对一个大文件的分块可能会失败,这似乎是发生在您身上的:一些块在一个新行上结束,而不是真正的行结束。