我有一个 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/