在Redshift的dplyr操作中重命名汇总生成的列
如何在dbplyr延迟计算中重命名Redshift聚合生成的列
其实你完全不需要把数据加载到内存里就能解决这个问题,核心是用正确的方式处理延迟计算表的列名——两种方法都能保持dbplyr的延迟特性,让所有操作在Redshift端完成。
方法一:在summarise时直接指定列名(推荐)
你之前用summarise(sum(purchases))会生成默认的sum(purchases)列名,但其实可以在聚合步骤直接给结果命名,这样生成的延迟表直接就有purchases列,后续join自然会产生purchases.x和purchases.y:
data <- tbl(conn, "customers") %>% filter(age >= 18) subset <- data %>% filter(eye_color != "brown") %>% group_by(gender, method, age, region) %>% summarise(purchases = sum(purchases), .groups = "drop") %>% # 直接将聚合结果命名为purchases full_join(data, by=c("region", "age", "method"))
这里的.groups = "drop"是为了在聚合后取消分组,避免分组状态干扰后续的join操作;如果你的业务逻辑需要保留分组,可以根据需求调整这个参数。
方法二:事后对延迟表重命名
如果已经生成了带有sum(purchases)列的延迟表,也可以用rename重命名,但要注意原列名包含括号这种特殊字符,必须用反引号把它括起来,这样R才能正确识别这是一个列名而非函数调用:
data <- tbl(conn, "customers") %>% filter(age >= 18) subset <- data %>% filter(eye_color != "brown") %>% group_by(gender, method, age, region) %>% summarise(sum(purchases)) %>% rename(purchases = `sum(purchases)`) %>% # 用反引号包裹带特殊字符的原列名 full_join(data, by=c("region", "age", "method"))
这个方法同样会被dbplyr转换成对应的SQL别名操作,全程在Redshift端执行,不需要把数据拉到本地内存。
为什么之前的重命名方法没生效?
你尝试的rename等方法无效,大概率是因为没正确处理sum(purchases)这个带特殊字符的列名——普通的rename(purchases = sum(purchases))会被R当成调用sum(purchases)函数,而非引用列名,用反引号包裹后才能让R正确识别这是一个列名。
内容的提问来源于stack exchange,提问作者Minh
相关产品推荐
相关产品推荐

