【问题标题】:pyarrow throws ArrowNotImplementedError when creating table from numpy array从 numpy 数组创建表时,pyarrow 抛出 ArrowNotImplementedError
【发布时间】:2021-06-21 20:48:18
【问题描述】:

此代码尝试创建pyarrow 表以将其存储在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

【问题讨论】:

    标签: python parquet pyarrow


    【解决方案1】:

    Numpy 数组不能有异构类型(同一数组中的 int、float 字符串)。所以在这种情况下,数组的类型是 <U32(一个 32 个字符的 little-endian Unicode 字符串,也就是字符串)。

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

    所以 int 和 floats 被转换为 string,而 arrow 必须将 hte 字符串分别转换回 int、float。

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

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

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

    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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-19
      • 2017-12-30
      相关资源
      最近更新 更多