R {arrow}:读出 data.frame 是 "identical" 到原始但生成不同的散列

R {arrow}: read out data.frame is "identical" to original but generates different hash

我有兴趣确保在 write (to format x)->read 操作后获得的 data.frame 对象始终相同,无论使用何种中间格式。

我正在尝试不同的测试,包括散列所有列和散列 data.frame 对象本身并与原始对象进行比较。这似乎适用于开箱即用的 csvs。但是,在编写镶木地板时,我发现对象不会生成相同的散列,即使所有列都生成相同的散列也是如此。

重现代码:

library(arrow)

df <- data.frame(foo = c(1,2,3), bar=c(4.5, 4.6, 4.7))

write.csv(df, "test_csv.csv", row.names=F)
write_parquet(df, "test_parquet.parquet")

df_csv <- read.csv("test_csv.csv", colClasses=lapply(df, class))
df_parquet <- read_parquet("test_parquet.parquet")

# size is the same
print(object.size(df) == object.size(df_csv))
# [1] TRUE
print(object.size(df) == object.size(df_parquet))
# [1] TRUE

# objects are 'identical'
print(identical(df, df_csv))
# [1] TRUE
print(identical(df, df_parquet))
# [1] TRUE

# all columns generate same hash
print(all(sapply(df, digest)==sapply(df_csv, digest)))
# [1] TRUE
print(all(sapply(df, digest)==sapply(df_parquet, digest)))
# [1] TRUE

# objects generate the same hash
print(digest(df)==digest(df_csv))
# [1] TRUE
print(digest(df)==digest(df_parquet))
# [1] FALSE

我认为这与某些不同的元数据有关,但我不知道是什么。这似乎不是名称或列 类:

的问题
# it's not the names or element classes
> all(colnames(df_csv) == colnames(df_parquet))
# [1] TRUE
> all(row.names(df_csv) == row.names(df_parquet))
# [1] TRUE
> identical(lapply(df_csv,class), lapply(df_parquet,class))
# [1] TRUE

如有任何帮助,我们将不胜感激。

在我看来,这可能与属性的顺序有关。如果我在每个对象上 运行 dput(),它匹配 dfdf_csv 但不匹配 df_parquet:

> dput(df)
structure(list(foo = c(1, 2, 3), bar = c(4.5, 4.6, 4.7)), class = "data.frame", row.names = c(NA, 
-3L))
> dput(df_csv)
structure(list(foo = c(1, 2, 3), bar = c(4.5, 4.6, 4.7)), class = "data.frame", row.names = c(NA, 
-3L))
> dput(df_parquet)
structure(list(foo = c(1, 2, 3), bar = c(4.5, 4.6, 4.7)), row.names = c(NA, 
3L), class = "data.frame")