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()
,它匹配 df
和 df_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")
我有兴趣确保在 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()
,它匹配 df
和 df_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")