为什么我们不能转换 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版本将于明天发布。 (此错误修复可能是最后一次预发布。)
这个问题的跟进;
保存嵌套 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版本将于明天发布。 (此错误修复可能是最后一次预发布。)