python-3.x - 如何更新pyarrow表中的数据?

我有一个 python 脚本,它使用 pyarrow 读取 Parquet 文件。我正在尝试遍历表以更新其中的值。如果我尝试这样做:

for col_name in table2.column_names:
    if col_name in my_columns:
        print('updating values in column '  + col_name)
        
        col_data = pa.Table.column(table2, col_name)
        
        row_ct = 1
        for i in col_data:
            pa.Table.column(table2, col_name)[row_ct] = change_str(pa.StringScalar.as_py(i))
            row_ct += 1

我收到这个错误:

 TypeError: 'pyarrow.lib.ChunkedArray' object does not support item assignment

如何更新这些值?

我尝试使用 pandas,但它无法处理原始表中的空值,而且它还错误地转换了原始表中列的数据类型。 pyarrow 是否有原生方式来编辑数据?

最佳答案

箭头表(和数组)是不可变的。因此,您将无法就地更新表格。

实现此目的的方法是在修改数据时创建数据副本。 Arrow 支持对 modify strings 的一些基本操作, 但它们非常有限。

另一种选择是使用 pandas,但正如您所注意到的,从箭头到 pandas 再返回并不是无缝的。

让我们举个例子:

>>> table = pa.Table.from_arrays(
    [ 
        pa.array(['abc', 'def'], pa.string()),
        pa.array([1, None], pa.int32()),
    ],
    schema=pa.schema(
    [
        pa.field('str_col', pa.string()), 
        pa.field('int_col', pa.int32()), 
    ]
    )
)
>>> from_pandas = pa.Table.from_pandas(table.to_pandas())
>>> from_pandas.schema
str_col: string
int_col: double
-- schema metadata --
pandas: '{"index_columns": [{"kind": "range", "name": null, "start": 0, "' + 487

您可以看到转换为 pandas 并返回已将 int 列的类型更改为 double。这是因为 pandas 不能很好地支持 null int 值,所以它将 int 列转换为 double。

为避免此问题,我建议逐列工作,仅将字符串列转换为 pandas:

def my_func(value):
    return 'hello ' + value + '!'


columns = []
my_columns = ['str_col']
for column_name in table.column_names:
    column_data = table[column_name]
    if column_name in my_columns:
        column_data = pa.array(table['str_col'].to_pandas().apply(my_func))
    columns.append(column_data)

updated_table = pa.Table.from_arrays(
    columns, 
    schema=table.schema
)
>>> table['str_col']
<pyarrow.lib.ChunkedArray object at 0x7f05f42b3f40>
[
  [
    "hello abc!",
    "hello def!"
  ]
]

https://stackoverflow.com/questions/65845694/

相关文章:

javascript - 基于另一个对象递归更新特定键的嵌套对象值

python - 如何将 seaborn 图保存为 svg 或 png

python - 检查列表与列表理解重叠

node.js - 如何监视我的 azure 函数的变化?

c# - EF Core 5.0 - 更新 ASP.NET Core Web API 中的多对多实体

visual-studio-code - 更新 VS CODE 加载工作区文件夹时出错

c - 为什么我的 C 中的 sin 计算代码返回错误的值?

python - 获取不规则形状的中心

c - sizeof 运算符在 c 中显示错误的结构大小

python - 按值属性对字典进行排序