【问题标题】:call StructArray.from_arrays specifying a missing value mask调用 StructArray.from_arrays 指定缺失值掩码
【发布时间】:2021-07-28 17:01:09
【问题描述】:

我正在尝试创建一个缺少值的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,指定一个缺失值的掩码?或者以后有办法敷面膜吗?

【问题讨论】:

  • C++ API 允许这样做(接受一个空位图),但目前 python API 不公开它(总是传递一个空缓冲区)。您可以创建 JIRA 票证吗?
  • 谢谢,我已经创建了一个 jira,现在我会坚持使用 pa.arrayissues.apache.org/jira/browse/ARROW-12677

标签: python pyarrow apache-arrow


【解决方案1】:

通过在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"
  ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2013-04-11
    • 1970-01-01
    • 2015-10-11
    相关资源
    最近更新 更多