我有一个数据框,我想使用Arrow.write()
.
我可以通过省略一列来保存它的子帧。但是,如果我将列留在其中,我会收到此错误:
ArgumentError:类型没有确定数量的字段
此列中的对象都是 4-Tuples,它们的元素要么是空的 Tuples,要么是 Int64 的 1-或 2-Tuples。典型的例子是((1), (), (2), ())
和((1, 2), (), (), ())
。如果我使用 Arrays of Arrays 而不是 Tuples of Tuples,它工作得很好。我更喜欢使用元组,并且我不希望在写入之前和读取之后不必处理数据(请注意,这也排除了使用四个单独的列之类的事情——另外我怀疑有 2-tuples 和 1-tuples 并且为空同一列中的元组会产生相同的错误)。
我不太明白这里错误的含义,所以我不确定如何修复它。有简单的解决方法吗?还是我需要改用数组?
这是一个最小的工作示例,它给了我这个错误:
using Arrow, DataFrames
x = ((1,), (1,), (), ());
y = ((1, 2), (), (), ());
df = DataFrame(col = [x, y]);
Arrow.write("test.arrow", df)
如果我使用col=[x]
or 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
我的用例会是什么。