标签: fastparquet

如何在python中使用pyarrow从S3读取分区镶木地板文件

我正在寻找使用python从s3读取多个分区目录数据的方法.

data_folder/serial_number = 1/cur_date = 20-12-2012/abcdsd0324324.snappy.parquet data_folder/serial_number = 2/cur_date = 27-12-2012/asdsdfsd0324324.snappy.parquet

pyarrow的ParquetDataset模块具有从分区读取的能力.所以我尝试了以下代码:

>>> import pandas as pd
>>> import pyarrow.parquet as pq
>>> import s3fs
>>> a = "s3://my_bucker/path/to/data_folder/"
>>> dataset = pq.ParquetDataset(a)
Run Code Online (Sandbox Code Playgroud)

它引发了以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/my_username/anaconda3/lib/python3.6/site-packages/pyarrow/parquet.py", line 502, in __init__
    self.metadata_path) = _make_manifest(path_or_paths, self.fs)
  File "/home/my_username/anaconda3/lib/python3.6/site-packages/pyarrow/parquet.py", line 601, in _make_manifest
    .format(path))
OSError: Passed non-file path: s3://my_bucker/path/to/data_folder/
Run Code Online (Sandbox Code Playgroud)

根据pyarrow的文档,我尝试使用s3fs作为文件系统,即:

>>> dataset = pq.ParquetDataset(a,filesystem=s3fs)
Run Code Online (Sandbox Code Playgroud)

这会引发以下错误:

Traceback (most recent call last):
  File "<stdin>", …
Run Code Online (Sandbox Code Playgroud)

python parquet arrow-python fastparquet

18
推荐指数
4
解决办法
2万
查看次数

是否可以将巨大的dask数据框保存到镶木地板中?

我有一个由100,000多行组成的数据帧,每行有100,000列,总共10,000,000,000个浮点值.

我已经成功地在一个csv(制表符分隔的)文件中读取它们,并且我成功地将它们读取到具有250GB RAM的50核Xeon机器并尝试将其写为.parq目录,如下所示:

浮动huge.csv内容保存为字符串,为125GB.

import dask.dataframe as dd
filename = 'huge.csv'
df = dd.read_csv(filename, delimiter='\t', sample=500000000)
df.to_parquet('huge.parq')
Run Code Online (Sandbox Code Playgroud)

它已经写了huge.parq近一个星期,目录是14GB,看起来保存的过程.to_parquet不会很快停止.

并且free -mh显示仍有可用内存但是保存.parq目录所花费的时间非常慢:

$ free -mh
              total        used        free      shared  buff/cache   available
Mem:           251G         98G         52G         10M        101G        152G
Swap:          238G          0B        238G
Run Code Online (Sandbox Code Playgroud)

问题是:

  • 考虑到数据帧和机器的大小,将dask数据帧保存到镶木地板文件是否可行?

  • 保存庞大的数据帧是否正常daskfastparquet花费这么长时间?

  • 有没有办法估计保存镶木地板文件所需的时间?

python dataframe parquet dask fastparquet

15
推荐指数
1
解决办法
2403
查看次数

pyarrow.lib.ArrowInvalid: ('无法将 X 转换为 Y 类型:在推断 Arrow 数据类型时无法识别 Python 值类型')

使用以下代码pyarrowpandas.DataFrame包含Player对象转换为 apyarrow.Table

import pandas as pd
import pyarrow as pa

class Player:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

    def __repr__(self):
        return f'<{self.name} ({self.age})>'

data = [
    Player('Jack', 21, 'm'),
    Player('Ryan', 18, 'm'),
    Player('Jane', 35, 'f'),
]
df = pd.DataFrame(data, columns=['player'])
print(pa.Table.from_pandas(df))
Run Code Online (Sandbox Code Playgroud)

我们得到错误:

pyarrow.lib.ArrowInvalid: ('Could not convert <Jack (21)> with type Player: did not recognize Python value type when inferring an Arrow data type', 'Conversion failed …
Run Code Online (Sandbox Code Playgroud)

python pandas parquet fastparquet pyarrow

14
推荐指数
2
解决办法
7664
查看次数

fastparquet和pyarrow之间的比较?

经过一番搜索我没有找到一个彻底的比较fastparquetpyarrow

我找到了这篇博客文章(速度的基本比较)。

还有一个github 讨论,声称使用github 创建的文件fastparquet不支持AWS-athena(顺便说一句,情况仍然如此吗?)

什么时候/为什么要在另一个上使用?主要优点和缺点是什么?


我的特定用例是处理数据,方法是将数据dask写入s3,然后使用AWS-athena进行读取/分析。

python parquet dask fastparquet pyarrow

12
推荐指数
4
解决办法
7916
查看次数

以内存高效的方式从 python 中的流创建 Parquet 文件

在 Python 中创建 Parquet 文件的最常见方法似乎是首先创建 Pandas 数据框,然后使用 pyarrow 将表写入 Parquet。我担心这可能会导致内存使用量过大 - 因为它需要至少将数据集的一份完整副本存储在内存中才能创建 pandas 数据帧。

我想知道是否由于列压缩要求而需要将整个数据集加载到内存中,或者是否有更高效且基于流的方法。就我而言,我将以流媒体方式接收记录。对于类似的 csv 输出过程,我们以 1000 为批量将行写入磁盘,因此需要在内存中保存的行数永远不会达到完整数据集的大小。

我是不是该...?:

  1. 只需创建一个 pandas 数据框,然后将其写入镶木地板。(这意味着整个数据集需要存储在内存中,但我们将此视为必要要求。)
  2. 使用一些流友好的方式在我们收到它们时一次写入 1000 行左右,从而最大限度地减少整个过程中总的时间点 ram 消耗。(我没有看到任何有关如何执行此操作的文档,而且我不确定它是否是镶木地板的选项。)
  3. 将所有内容写入 CSV,然后使用智能读取/分析 CSV 内容并在事后创建压缩镶木地板的函数。(运行时间可能较慢,但内存配置文件较低,并且在非常大的文件上失败的机会较低。)

想法?建议?

python parquet fastparquet pyarrow

10
推荐指数
1
解决办法
5740
查看次数

减压'SNAPPY'不适用于fastparquet

我正在尝试使用fastparquet打开文件,但出现错误:

RuntimeError: Decompression 'SNAPPY' not available.  Options: ['GZIP', 'UNCOMPRESSED']
Run Code Online (Sandbox Code Playgroud)

我已安装以下设备,并重新启动了我的解释器:

python                    3.6.5                hc3d631a_2  
python-snappy             0.5.2                    py36_0    conda-forge
snappy                    1.1.7                hbae5bb6_3  
fastparquet               0.1.5                    py36_0    conda-forge
Run Code Online (Sandbox Code Playgroud)

一切下载顺利。我不知道我是否需要snappy或python-snappy,所以我得到了一个没有解决办法,却得到了另一个,但仍然没有成功。下载快照时,我发现的所有相关问题均已修复,但是使用两个快照时,仍然出现此错误!任何帮助,将不胜感激。

python-3.x snappy fastparquet

8
推荐指数
2
解决办法
2996
查看次数

使用 dask read_parquet 方法过滤会产生不需要的结果

我正在尝试使用dask read_parquet方法和filterskwarg读取镶木地板文件。但是它有时不会根据给定的条件进行过滤。

示例:使用dates列创建和保存数据框

import pandas as pd
import numpy as np
import dask.dataframe as dd

nums  = range(1,6)
dates = pd.date_range('2018-07-01', periods=5, freq='1d')
df = pd.DataFrame({'dates':dates, 'nums': nums})

ddf = dd.from_pandas(df, npartitions=3).to_parquet('test_par', engine = 'fastparquet')
Run Code Online (Sandbox Code Playgroud)

当我dates'test_par'文件夹中读取和过滤列时,它似乎不起作用

filters=[('dates', '>', np.datetime64('2018-07-04'))]
df  = dd.read_parquet('test_par', engine='fastparquet', filters=filters).compute()
Run Code Online (Sandbox Code Playgroud)

正如您在输出中看到的那样,2018-07-03并且2018-07-04存在。

+-------+------------+------+
|       | dates      | nums |
+-------+------------+------+
| index |            |      |
+-------+------------+------+
| 2     | 2018-07-03 | 3    | …
Run Code Online (Sandbox Code Playgroud)

python filtering dataframe dask fastparquet

7
推荐指数
1
解决办法
2853
查看次数

无法读取镶木地板文件

我现在正在为此感到头疼。我是这个parquet文件的新手,我遇到了很多问题。

OSError: Passed non-file path: \datasets\proj\train\train.parquet每次我尝试从中创建一个时,都会抛出一个错误df

我试过这个: pq.read_pandas(r'E:\datasets\proj\train\train.parquet').to_pandas()od = pd.read_parquet(r'E:\datasets\proj\train\train.parquet', engine='pyarrow')

我还更改了数据集所在驱动器的驱动器号,这是一样的!

所有引擎都一样。

请帮忙!

python pandas parquet fastparquet pyarrow

7
推荐指数
1
解决办法
8621
查看次数

如何在没有足够 RAM 的情况下使用 Pandas 打开巨大的镶木地板文件

我正在尝试使用 Pandasread_parquet函数将一个相当大的 Parquet 文件(约 2 GB,约 3000 万行)读入我的 Jupyter Notebook(在 Python 3 中)。我还安装了该函数用作镶木地板文件引擎的pyarrowfastparquetread_parquet。不幸的是,似乎在阅读时,我的计算机死机,最终我收到一个错误,说它内存不足(我不想重复运行代码,因为这会导致再次冻结 - 我不知道逐字错误消息)。

有没有一种好方法可以将镶木地板文件的某些部分写入内存而不会发生这种情况?我知道镶木地板文件是柱状的,可能无法仅将部分记录存储到内存中,但如果有解决方法,我想将其拆分,或者看看我在尝试时是否做错了什么读入。

就规格而言,我确实有一台相对较弱的计算机,只有 6 GB 内存和 i3。CPU 为 2.2 GHz,可使用 Turbo Boost。

python pandas parquet fastparquet pyarrow

7
推荐指数
2
解决办法
2119
查看次数

为什么索引名称总是出现在用 pandas 创建的 parquet 文件中?

我正在尝试使用 pandas dataframe 创建镶木地板,即使我删除了文件的索引,当我重新读取镶木地板文件时它仍然出现。谁能帮我这个?我希望将 index.name 设置为None

>>> df = pd.DataFrame({'key': 1}, index=[0])
>>> df
  key
0    1
>>> df.to_parquet('test.parquet')
>>> df = pd.read_parquet('test.parquet')
>>> df
     key
index     
0        1
>>> del df.index.name
>>> df
     key
0    1
>>> df.to_parquet('test.parquet')
>>> df = pd.read_parquet('test.parquet')
>>> df
     key
index     
0        1
Run Code Online (Sandbox Code Playgroud)

dataframe python-3.x pandas parquet fastparquet

6
推荐指数
1
解决办法
1万
查看次数