我正在寻找使用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) 我有一个由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数据帧保存到镶木地板文件是否可行?
保存庞大的数据帧是否正常dask
并fastparquet
花费这么长时间?
有没有办法估计保存镶木地板文件所需的时间?
使用以下代码pyarrow
将pandas.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 中创建 Parquet 文件的最常见方法似乎是首先创建 Pandas 数据框,然后使用 pyarrow 将表写入 Parquet。我担心这可能会导致内存使用量过大 - 因为它需要至少将数据集的一份完整副本存储在内存中才能创建 pandas 数据帧。
我想知道是否由于列压缩要求而需要将整个数据集加载到内存中,或者是否有更高效且基于流的方法。就我而言,我将以流媒体方式接收记录。对于类似的 csv 输出过程,我们以 1000 为批量将行写入磁盘,因此需要在内存中保存的行数永远不会达到完整数据集的大小。
我是不是该...?:
想法?建议?
我正在尝试使用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,所以我得到了一个没有解决办法,却得到了另一个,但仍然没有成功。下载快照时,我发现的所有相关问题均已修复,但是使用两个快照时,仍然出现此错误!任何帮助,将不胜感激。
我正在尝试使用dask
read_parquet
方法和filters
kwarg读取镶木地板文件。但是它有时不会根据给定的条件进行过滤。
示例:使用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) 我现在正在为此感到头疼。我是这个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')
我还更改了数据集所在驱动器的驱动器号,这是一样的!
所有引擎都一样。
请帮忙!
我正在尝试使用 Pandasread_parquet
函数将一个相当大的 Parquet 文件(约 2 GB,约 3000 万行)读入我的 Jupyter Notebook(在 Python 3 中)。我还安装了该函数用作镶木地板文件引擎的pyarrow
和fastparquet
库read_parquet
。不幸的是,似乎在阅读时,我的计算机死机,最终我收到一个错误,说它内存不足(我不想重复运行代码,因为这会导致再次冻结 - 我不知道逐字错误消息)。
有没有一种好方法可以将镶木地板文件的某些部分写入内存而不会发生这种情况?我知道镶木地板文件是柱状的,可能无法仅将部分记录存储到内存中,但如果有解决方法,我想将其拆分,或者看看我在尝试时是否做错了什么读入。
就规格而言,我确实有一台相对较弱的计算机,只有 6 GB 内存和 i3。CPU 为 2.2 GHz,可使用 Turbo Boost。
我正在尝试使用 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) fastparquet ×10
parquet ×8
python ×8
pyarrow ×5
pandas ×4
dask ×3
dataframe ×3
python-3.x ×2
arrow-python ×1
filtering ×1
snappy ×1