调用 StructArray.from_arrays 指定缺失值掩码

call StructArray.from_arrays specifying a missing value mask

我正在尝试创建一个 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.int64()), pyarrow.field("col2", pyarrow.string())]
)
-- is_valid: all not null
-- child 0 type: int64
  [
    null,
    1
  ]
-- child 1 type: string
  [
    null,
    "foo"
  ]

有没有办法从数组创建一个 StructArray,指定一个缺失值的掩码?或者以后有没有办法敷面膜?

通过在 StructArray.from_arrays 中传递一个 mask 确实很好(-> https://issues.apache.org/jira/browse/ARROW-12677,感谢您提出问题)。

但目前,一个可能的解决方法是使用较低级别的 StructArray.from_buffers:

struct_type = pyarrow.struct(
    [pyarrow.field('col1', pyarrow.int64()), pyarrow.field("col2", pyarrow.string())]
)
col1 = pyarrow.array([None, 1])
col2 = pyarrow.array([None, "foo"])

正在创建一个 pyarrow 掩码数组来构造一个有效性缓冲区:

mask = np.array([True, False])
validity_mask = pyarrow.array(~mask)
validity_bitmask = validity_mask.buffers()[1]

然后我们可以将其用作 from_buffers 中的第一个缓冲区,以指示 StructArray 中的缺失值:

>>> pyarrow.StructArray.from_buffers(struct_type, len(col1), [validity_bitmask], children=[col1, col2])
<pyarrow.lib.StructArray object at 0x7f8b560fa2e0>
-- is_valid:
  [
    false,
    true
  ]
-- child 0 type: int64
  [
    null,
    1
  ]
-- child 1 type: string
  [
    null,
    "foo"
  ]