如何将具有相同列数据帧列表列的数据帧保存为带有箭头的镶木地板?
How do I save a dataframe with a list column of same-columned dataframes to parquet with arrow?
我有一个包含大约 1200 列的数据框,其中一列是列表。使用 arrow::write_parquet() 时,可以正确检测除列表列以外的所有列。列表列有很多 NULL 值。存在的值是数据框本身,具有五个字符列(始终具有相同的 5 个名称)和 1 到多行。 (如果 'NULL' 值导致问题,我可以将零行数据帧放在它们的位置。)
有没有办法为一个列表列指定架构并检测其余列,以便我可以将数据框保存到镶木地板?
我发现即使您定义了一个包含列表列结构的架构 (my_schema
),如果 [=30] 的某些行 write_parquet(df,schema=my_schema)
仍然会失败=] 与具有该结构的行不具有相同的结构(即,如果某些行是 NA)
例如,如果 dat
是一个包含五列的 data.table,其中一列是包含 data.table...
的列表列
grp data a b c
<num> <list> <num> <num> <num>
1: 1 <data.table[100x3]> 0.6142948 -1.0359482 -0.3782694
2: 2 NA 0.1192991 0.1889432 0.2735809
3: 3 <data.table[100x3]> 0.4198558 0.6189989 -0.8201980
然后,write_parquet(dat, schema=my_schema)
将失败(即 Error: Invalid: Can only convert data frames to Struct type
)。
我认为在该列表列中放置与其他 table 结构相同的 0 行 table 的方法是个好主意:
# get a null table of same structure
null_table = dat[!is.na(data)]$data[[1]][0,]
# replace the NA with the null_table
dat[is.na(data),data:=list(null_table)]
# write the parquet file
write_parquet(dat, "dat.pqt")
这很容易检索:
# Read the file
dat = read_parquet("dat.pqt")
# Convert the arrow list to data.table
dat$data= lapply(dat$data, data.table)
# Convert the data.tables with 0 rows back to NA
dat[sapply(dat$data,nrow)==0,data:=NA][]
grp data a b c
<num> <list> <num> <num> <num>
1: 1 <data.table[100x3]> 0.6142948 -1.0359482 -0.3782694
2: 2 NA 0.1192991 0.1889432 0.2735809
3: 3 <data.table[100x3]> 0.4198558 0.6189989 -0.8201980
我有一个包含大约 1200 列的数据框,其中一列是列表。使用 arrow::write_parquet() 时,可以正确检测除列表列以外的所有列。列表列有很多 NULL 值。存在的值是数据框本身,具有五个字符列(始终具有相同的 5 个名称)和 1 到多行。 (如果 'NULL' 值导致问题,我可以将零行数据帧放在它们的位置。)
有没有办法为一个列表列指定架构并检测其余列,以便我可以将数据框保存到镶木地板?
我发现即使您定义了一个包含列表列结构的架构 (my_schema
),如果 [=30] 的某些行 write_parquet(df,schema=my_schema)
仍然会失败=] 与具有该结构的行不具有相同的结构(即,如果某些行是 NA)
例如,如果 dat
是一个包含五列的 data.table,其中一列是包含 data.table...
grp data a b c
<num> <list> <num> <num> <num>
1: 1 <data.table[100x3]> 0.6142948 -1.0359482 -0.3782694
2: 2 NA 0.1192991 0.1889432 0.2735809
3: 3 <data.table[100x3]> 0.4198558 0.6189989 -0.8201980
然后,write_parquet(dat, schema=my_schema)
将失败(即 Error: Invalid: Can only convert data frames to Struct type
)。
我认为在该列表列中放置与其他 table 结构相同的 0 行 table 的方法是个好主意:
# get a null table of same structure
null_table = dat[!is.na(data)]$data[[1]][0,]
# replace the NA with the null_table
dat[is.na(data),data:=list(null_table)]
# write the parquet file
write_parquet(dat, "dat.pqt")
这很容易检索:
# Read the file
dat = read_parquet("dat.pqt")
# Convert the arrow list to data.table
dat$data= lapply(dat$data, data.table)
# Convert the data.tables with 0 rows back to NA
dat[sapply(dat$data,nrow)==0,data:=NA][]
grp data a b c
<num> <list> <num> <num> <num>
1: 1 <data.table[100x3]> 0.6142948 -1.0359482 -0.3782694
2: 2 NA 0.1192991 0.1889432 0.2735809
3: 3 <data.table[100x3]> 0.4198558 0.6189989 -0.8201980