pyarrow 在从 numpy 数组创建 table 时抛出 ArrowNotImplementedError

pyarrow throws ArrowNotImplementedError when creating table from numpy array

此代码尝试创建 pyarrow table 以将其存储在 parquet 中,但从 numpy 数组转换时出现错误。这是什么错误以及如何解决?

import numpy as np
import pyarrow as pa
import pyarrow.parquet as pq

array = np.array(
    [
        [1.1, 1.2, 1.4],
        [1, 2, 5],
        ['a', 'b', 'c']
    ]
)

fields = [pa.field('field1',pa.float64()),
          pa.field('field2',pa.int64()),
          pa.field('field3',pa.string())]

array_table = pa.Table.from_arrays(array, schema=pa.schema(fields))

from_arrays 抛出:

ArrowNotImplementedError: NumPy type not implemented: unrecognized type (19) in GetNumPyTypeName

Numpy 数组不能有异构类型(同一数组中的 int、float 字符串)。因此,在这种情况下,数组的类型为 <U32(32 个字符的小端 Unicode 字符串,换句话说,字符串)。

>>> array.dtype
dtype('<U32')

因此整数和浮点数被转换为字符串,而箭头必须分别将 hte 字符串转换回 int、浮点数。

但是 Arrow 无法将 numpy 字符串转换为 int 和 float:

pa.array(np.array([1,2,3], dtype='<U32'), pa.int32())
>>> NumPy type not implemented: unrecognized type (19) in GetNumPyTypeName

相反,您应该为 table 中的每一列创建一个数组,每个列都有自己的类型,并且它应该可以工作:

arrays =     [
        np.array([1.1, 1.2, 1.4]),
        np.array([1, 2, 5]),
        np.array(['a', 'b', 'c'])
    ]


fields = [pa.field('field1',pa.float64()),
          pa.field('field2',pa.int64()),
          pa.field('field3',pa.string())]

array_table = pa.Table.from_arrays(arrays, schema=pa.schema(fields))