如何用支持Arrow的dplyr方法按字典拆分字符串为多列?
基于Apache Arrow按字典拆分字符串为多列的实现方案
需求背景
针对超内存数据集,需使用Apache Arrow支持的方法(可使用非dplyr函数),根据给定变量字典将字符串字段拆分为指定长度的多列。已知separate函数不被Arrow支持,需采用Arrow官方兼容的函数实现。
原始数据与变量字典
vardic <- data.frame(varname=c('a','b','c','d'), length=c(2,6,3,1) ) %>% mutate(end=cumsum(length),start=end-length+1) d <- data.frame(orig_string=c('11333333444A', '22444444111C', '55666666000B'))
期望输出
d2 <- data.frame(a=c(11,22,55),b=c(333333,444444,666666),c=c(444,111,000),d=c('A','C','B'))
解决方案
利用Arrow支持的substr函数,结合动态生成表达式的方式批量拆分列,全程基于Arrow延迟计算处理超大数据集:
library(tidyverse) library(arrow) # 将原始数据写入Parquet格式数据集(超大数据可直接使用已有数据集路径) d %>% write_dataset('myfile', format='parquet') # 基于变量字典生成批量截取表达式 split_exprs <- pmap(vardic, function(varname, start, end, ...) { expr(substr(orig_string, !!start, !!end)) }) %>% set_names(vardic$varname) # 处理Arrow数据集并拆分列 result <- open_dataset('myfile') %>% mutate(!!!split_exprs) %>% # 可选:转换指定列为数值型(Arrow支持该操作) mutate(across(c(a, b, c), as.numeric)) %>% collect() # 若无需加载到内存,可省略collect,保持Arrow数据集格式 # 查看结果 print(result)
说明
- Arrow支持的
substr函数可直接按起始/结束索引截取字符串,完美匹配字典中定义的start和end位置; - 通过
pmap和expr动态生成拆分表达式,避免手动编写重复代码; - 全程采用Arrow延迟计算,仅在调用
collect()时才会将数据加载到内存,适配超内存场景; - 类型转换步骤可根据实际需求调整,Arrow支持常见的类型转换函数。
内容的提问来源于stack exchange,提问作者LucasMation
相关产品推荐
相关产品推荐

