为什么我们不能转换 awkward1 数组 `to_parquet` 的扁平列?

Why can't we convert flat columns of awkward1 arrays `to_parquet`?

这个问题的跟进;

保存嵌套 awkward1 数组的多列(长度可变);

import awkward1 as ak
dog = ak.from_iter([[1, 2], [5]])
cat = ak.from_iter([[4]])
pets = ak.zip({"dog": dog[np.newaxis], "cat": cat[np.newaxis]}, depth_limit=1)

ak.to_parquet(pets, "pets.parquet")

不幸的是,这似乎不适用于平面列表;

import awkward1 as ak
dog = ak.from_iter([1, 2, 5])
cat = ak.from_iter([4])
pets = ak.zip({"dog": dog[np.newaxis], "cat": cat[np.newaxis]}, depth_limit=1)

ak.to_parquet(pets, "pets.parquet")

产生错误;

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-31-7f3a7fefb261> in <module>
      3 cat = ak.from_iter([3])
      4 pets = ak.zip({"dog": dog[np.newaxis], "cat": cat[np.newaxis]}, depth_limit=1)
----> 5 ak.to_parquet(pets, "pets.parquet")

~/Programs/anaconda3/envs/tree/lib/python3.7/site-packages/awkward/operations/convert.py in to_parquet(array, where, explode_records, list_to32, string_to32, bytestring_to32, **options)
   2983     layout = to_layout(array, allow_record=False, allow_other=False)
   2984     iterator = batch_iterator(layout)
-> 2985     first = next(iterator)
   2986
   2987     if "schema" not in options:

~/Programs/anaconda3/envs/tree/lib/python3.7/site-packages/awkward/operations/convert.py in batch_iterator(layout)
   2978                 )
   2979             yield pyarrow.RecordBatch.from_arrays(
-> 2980                 pa_arrays, schema=pyarrow.schema(pa_fields)
   2981             )
   2982

~/Programs/anaconda3/envs/tree/lib/python3.7/site-packages/pyarrow/table.pxi in pyarrow.lib.RecordBatch.from_arrays()

TypeError: object of type 'pyarrow.lib.Tensor' has no len()

遇到这个错误的原因是什么?

您发现的是一个错误,现已修复:https://github.com/scikit-hep/awkward-1.0/pull/799

这里发生的事情是 pyarrow 无法将 pyarrow.lib.Tensor(常规长度列表,例如您使用 np.newaxis 创建的列表)写入 Parquet 文件。 Parquet 文件没有“常规长度列表”的概念,所以这是有道理的。但是 pyarrow 没有转换它,而是遇到了一个未处理的情况,在这种情况下它无法找到 pyarrow.lib.Tensor 的长度。 (有点奇怪 pyarrow.lib.Tensor 没有 __len__ 方法,但那是另一回事。)

无论如何,在 Awkward Array 的 1.2.0 版本中,我们将在写入 Parquet 时简单地将常规长度列表转换为(原则上)可变长度列表,因为格式没有这种类型。按照时间表,1.2.0版本将于明天发布。 (此错误修复可能是最后一次预发布。)