Trying to save a DataFrame using Arrow.jl gives: ArgumentError: type does not have a definite number of fields. Tuples of tuples of ints

Trying to save a DataFrame using Arrow.jl gives: ArgumentError: type does not have a definite number of fields. Tuples of tuples of ints

我有一个要使用 Arrow.write() 保存的数据框。

我可以通过省略一列来保存它的 子帧 。但是,如果我保留该列,则会出现此错误:

ArgumentError: type does not have a definite number of fields

本栏对象均为4元组,其元素均为空元组或Int64的1元组或2元组。典型的例子是 ((1), (), (2), ())((1, 2), (), (), ())。如果我使用数组的数组而不是元组的元组,它工作得很好。我更喜欢使用元组,并且我不希望在写入之前和读取之后不必处理数据 (请注意,这也排除了使用四个单独的列之类的事情——另外我怀疑有 2 元组和同一列中的 1 元组和空元组会产生相同的错误。

我不太明白这里错误的含义,所以我不确定如何解决它。 有没有简单的解决方法?还是我需要改用数组?

这是一个最小的工作示例,它给我这个错误:

using Arrow, DataFrames

x = ((1,), (1,), (), ());
y = ((1, 2), (), (), ());
df = DataFrame(col = [x, y]);
Arrow.write("test.arrow", df)

如果我使用 col=[x]col=[y],它会起作用,所以问题源于在同一向量中具有两个元组形状。也许这是 Arrow 的基本限制?

有关错误消息的更多详细信息:错误消息来自 reflection.jl 行 764,在 fieldcount(@nospecialize t) 中。此函数由 Arrow 的 arrowvector(在 `arraytypes/struct.jl' 中调用)。这是完整的函数定义:

function arrowvector(::StructKind, x, i, nl, fi, de, ded, meta; kw...)
    len = length(x)
    validity = ValidityBitmap(x)
    T = Base.nonmissingtype(eltype(x))
    data = Tuple(arrowvector(ToStruct(x, j), i, nl + 1, j, de, ded, nothing; kw...) for j = 1:fieldcount(T))
    return Struct{withmissing(eltype(x), namedtupletype(T, data)), typeof(data)}(validity, data, len, meta)
end

fieldcount 在第 5 行被调用,但我不知道 T 对我的用例是什么。

可能您需要更新您的软件包,因为您的问题在这些软件包的当前版本下无法重现。

PS 很难找到任何好的理由将这样的结构保存在数据框中。以每列都具有用于数据操作的最佳结构(如 Int、Float64 等)

的方式转换数据

通过在构造 DataFrame 之前显式键入数组来解决此问题。这是一个固定的工作示例:

using Arrow, DataFrames

x = ((1,), (1,), (), ());
y = ((1, 2), (), (), ());
T = Union{
    Tuple{Tuple{Int64}, Tuple{Int64}, Tuple{}, Tuple{}},
    Tuple{Tuple{Int64, Int64}, Tuple{}, Tuple{}, Tuple{}}
};
C = T[x, y];
df = DataFrame(col = C);
Arrow.write("test.arrow", df)