问题描述
我正在尝试创建一个缺少值的 pyarrow.StructArray
。
当我使用 pyarrow.array
传递表示我的记录的元组时,我工作正常:
>>> pyarrow.array(
[
None,(1,"foo"),],type=pyarrow.struct(
[pyarrow.field('col1',pyarrow.int64()),pyarrow.field("col2",pyarrow.string())]
)
)
-- is_valid:
[
false,true
]
-- child 0 type: int64
[
0,1
]
-- child 1 type: string
[
"","foo"
]
但我想使用 StructArray.from_arrays
并且据我所知没有办法为缺失值提供掩码:
pyarrow.StructArray.from_arrays(
[
[None,1],[None,"foo"]
],fields=[pyarrow.field('col1',pyarrow.string())]
)
-- is_valid: all not null
-- child 0 type: int64
[
null,1
]
-- child 1 type: string
[
null,"foo"
]
有没有办法从数组创建一个 StructArray,指定一个缺失值的掩码?或者以后有没有办法敷面膜?
解决方法
通过在 "scripts": {
"test": "echo \"No test specified\""
},
中传递 mask
(-> https://issues.apache.org/jira/browse/ARROW-12677,感谢您打开问题)来实现这一点确实很好。
但就目前而言,一种可能的解决方法可能是让用户使用较低级别的 StructArray.from_arrays
:
StructArray.from_buffers
创建一个pyarrow掩码数组来构造一个有效性缓冲区:
struct_type = pyarrow.struct(
[pyarrow.field('col1',pyarrow.int64()),pyarrow.field("col2",pyarrow.string())]
)
col1 = pyarrow.array([None,1])
col2 = pyarrow.array([None,"foo"])
然后我们可以使用它作为 mask = np.array([True,False])
validity_mask = pyarrow.array(~mask)
validity_bitmask = validity_mask.buffers()[1]
中的第一个缓冲区来指示 StructArray 中的缺失值:
from_buffers