标签: pyarrow

在熊猫数据框中查找嵌套列

我有一个包含许多列(压缩)JSON 格式的大型数据集。我正在尝试将其转换为镶木地板以进行后续处理。某些列具有嵌套结构。现在我想忽略这个结构,只是将这些列作为(JSON)字符串写出来。

所以对于我确定的列,我正在做:

df[column] = df[column].astype(str)
Run Code Online (Sandbox Code Playgroud)

但是,我不确定哪些列是嵌套的,哪些不是。当我用镶木地板书写时,我看到以下消息:

<stack trace redacted> 

  File "pyarrow/_parquet.pyx", line 1375, in pyarrow._parquet.ParquetWriter.write_table
  File "pyarrow/error.pxi", line 78, in pyarrow.lib.check_status
pyarrow.lib.ArrowInvalid: Nested column branch had multiple children: struct<coordinates: list<item: double>, type: string>
Run Code Online (Sandbox Code Playgroud)

这表明我未能将我的一列从嵌套对象转换为字符串。但应该归咎于哪个专栏?我怎么知道?

当我打印.dtypes我的 Pandas 数据框时,我无法区分字符串和嵌套值,因为两者都显示为object.

编辑:该错误通过显示结构详细信息提示了嵌套列,但这非常耗时调试。此外,它只打印第一个错误,如果您有多个嵌套列,这可能会很烦人

python python-3.x pandas pyarrow

8
推荐指数
1
解决办法
2399
查看次数

Linux pyarrow 未定义符号

我正在运行 Python 3.7.2 并使用 Miniconda3 创建一个名为 的新环境test-env。我已将默认渠道的软件包安装pyarrow到此环境中;然而,当我尝试 and 时import pyarrow,Python 解释器给了我一个未定义的符号错误:

Import Error: /test-env/lib/python3.7/site-packages/pyarrow/lib.cpython-37m-x86_64-linux-gnu.so: undefined symbol: _ZNK5arrow6Status8ToStringB5cxx11Ev
Run Code Online (Sandbox Code Playgroud)

从 SO 上的其他线程,我了解到这是由于编译器不兼容造成的。我不是开发人员,所以我不知道如何解决这个问题。

python-3.x pyarrow

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

无法读取镶木地板文件

我现在正在为此感到头疼。我是这个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
查看次数

如何将任意元数据分配给 pyarrow.Table / Parquet 列

用例

我正在使用 Apache Parquet 文件作为我在 Python 中使用 GeoPandas 处理大型空间数据的快速 IO 格式。我将要素几何存储为 WKB,并希望将坐标参考系统 (CRS) 记录为与 WKB 数据关联的元数据。

代码问题

我正在尝试将任意元数据分配给一个pyarrow.Field对象。

我试过的

假设tablepyarrow.Tabledf, a的实例化pandas.DataFrame

df = pd.DataFrame({
        'foo' : [1, 3, 2],
        'bar' : [6, 4, 5]
        })

table = pa.Table.from_pandas(df)
Run Code Online (Sandbox Code Playgroud)

根据pyarrow文档,列元数据包含在field属于schema( source ) 的 a 中,并且可选的元数据可以添加到field( source ) 中。

如果我尝试为该metadata属性赋值,则会引发错误:

>>> table.schema.field_by_name('foo').metadata = {'crs' : '4283'}
AttributeError: attribute 'metadata' of 'pyarrow.lib.Field' objects …
Run Code Online (Sandbox Code Playgroud)

python gis pandas parquet pyarrow

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

如何在没有足够 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
查看次数

使用 pyarrow 的 Python 错误 - ArrowNotImplementedError:未构建对编解码器“snappy”的支持

使用 Python、Parquet 和 SparkArrowNotImplementedError: Support for codec 'snappy' not built升级到pyarrow=3.0.0. 我以前没有这个错误的版本是pyarrow=0.17. 该错误出现在 中pyarrow=1.0.1但确实出现在pyarrow=2.0.0. 这个想法是使用 Snappy 压缩将 Pandas DataFrame 编写为 Parquet 数据集(在 Windows 上),然后使用 Spark 处理 Parquet 数据集。

import numpy as np
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

df = pd.DataFrame({
    'x': [0, 0, 0, 1, 1, 1], 
    'a': np.random.random(6), 
    'b': np.random.random(6)})
table = pa.Table.from_pandas(df, preserve_index=False)
pq.write_to_dataset(table, root_path=r'c:/data', partition_cols=['x'], flavor='spark')
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

parquet apache-arrow pyarrow

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

如何使用 Arrow 对 CSV 进行分块?

我正在尝试做什么

我正在使用PyArrow读取一些 CSV 并将它们转换为 Parquet。我读到的一些文件有很多列并且内存占用很大(足以使运行作业的机器崩溃)。我试图在读取 CSV 时对文件进行分块,其方式与 Pandas read_csvchunksize工作方式类似。

例如,这就是分块代码在 pandas 中的工作方式:

chunks = pandas.read_csv(data, chunksize=100, iterator=True)

# Iterate through chunks
for chunk in chunks:
    do_stuff(chunk)
Run Code Online (Sandbox Code Playgroud)

我想将类似的功能移植到 Arrow

我尝试过做什么

我注意到 Arrow 有ReadOptions其中包含一个block_size参数,我想也许我可以像这样使用它:

# Reading in-memory csv file
arrow_table = arrow_csv.read_csv(
    input_file=input_buffer,
    read_options=arrow_csv.ReadOptions(
        use_threads=True,
        block_size=4096
    )
)

# Iterate through batches
for batch in arrow_table.to_batches():
    do_stuff(batch)
Run Code Online (Sandbox Code Playgroud)

由于这个 ( block_size) 似乎没有返回迭代器,所以我的印象是这仍然会让 Arrow 读取内存中的整个表,从而重新创建我的问题。

最后,我知道我可以首先使用 Pandas 读取 csv 并对其进行分块,然后转换为 Arrow 表。但我试图避免使用 Pandas,只使用 Arrow。 …

python apache-arrow pyarrow

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

如何使用 pyarrow 存储自定义 Parquet 数据集元数据?

如何使用ParquetDatasetpyarrow 将自定义元数据存储?

例如,如果我使用 Dask 创建 Parquet 数据集

import dask
dask.datasets.timeseries().to_parquet('temp.parq')
Run Code Online (Sandbox Code Playgroud)

然后我可以使用 pyarrow 阅读它

import pyarrow.parquet as pq
dataset = pq.ParquetDataset('temp.parq')
Run Code Online (Sandbox Code Playgroud)

但是,我用于为单个 parquet 文件编写元数据的相同方法(在如何使用 pyarrow 编写 Parquet 元数据?中概述)不适用于 a ParquetDataset,因为没有replace_schema_metadata函数或类似的函数。

我想我可能想编写一个自定义_custom_metadata文件,因为我想存储的元数据与整个数据集有关。我想这个过程会类似于:

meta = pq.read_metadata('temp.parq/_common_metadata')
custom_metadata = { b'type': b'mydataset' }
merged_metadata = { **custom_metadata, **meta.metadata }
# TODO: Construct FileMetaData object with merged_metadata
new_meta.write_metadata_file('temp.parq/_common_metadata')
Run Code Online (Sandbox Code Playgroud)

python parquet pyarrow

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

如何将 pandas 数据框转换为箭头数据集?

在huggingface库中,有一种特殊格式的数据集,称为箭头数据集

https://arrow.apache.org/docs/python/dataset.html

https://huggingface.co/datasets/wiki_lingua

我必须将普通的 pandas 数据框转换为数据集或读取表格 csv 文件作为数据集。

那可能吗?

pandas pyarrow

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

如何从多个进程(可能来自不同的语言)使用 Apache Arrow IPC?

我不知道从哪里开始,所以寻找一些指导。我正在寻找一种在一个进程中创建一些数组/表,并可以从另一个进程访问(只读)的方法。

所以我创建了一个pyarrow.Table这样的:

a1 = pa.array(list(range(3)))
a2 = pa.array(["foo", "bar", "baz"])

a1
# <pyarrow.lib.Int64Array object at 0x7fd7c4510100>
# [
#   0,
#   1,
#   2
# ]

a2
# <pyarrow.lib.StringArray object at 0x7fd7c5d6fa00>
# [
#   "foo",
#   "bar",
#   "baz"
# ]

tbl = pa.Table.from_arrays([a1, a2], names=["num", "name"])

tbl
# pyarrow.Table
# num: int64
# name: string
# ----
# num: [[0,1,2]]
# name: [["foo","bar","baz"]]
Run Code Online (Sandbox Code Playgroud)

现在我如何从不同的进程中读取它?我以为我会使用multiprocessing.shared_memory.SharedMemory,但这不太有效:

shm = shared_memory.SharedMemory(name='pa_test', create=True, size=tbl.nbytes)
with pa.ipc.new_stream(shm.buf, tbl.schema) as out: …
Run Code Online (Sandbox Code Playgroud)

python ipc apache-arrow pyarrow

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

标签 统计

pyarrow ×10

python ×7

pandas ×5

parquet ×5

apache-arrow ×3

fastparquet ×2

python-3.x ×2

gis ×1

ipc ×1