如何在SparklyR中使用select函数提取Spark数组列的指定元素
你之前的测试写法全部失败的核心原因是:直接对字符串"C"做下标操作时,这个运算会在R本地优先执行完成,最终传给select的参数还是字符串"C",等价于直接选择原数组列,不会触发Spark端的数组元素提取逻辑。
在SparklyR中要通过select直接提取数组列元素,可使用以下两种成熟方案:
方法1:配合expr()写Spark SQL风格表达式
expr()可以把输入的SQL表达式直接透传给Spark执行,注意Spark SQL中的数组下标为1起始:
# 提取数组C的第2个元素,和你之前用mutate(C[[1]])得到的3、4结果完全一致 dfnew %>% select(my_first_element = expr("C[2]")) # 也可以同时保留原数组列 dfnew %>% select(C, my_first_element = expr("C[2]"))
方法2:调用Spark内置数组函数
你也可以直接调用Spark原生的数组处理函数实现,两种函数索引规则不同:
element_at:1起始索引,和Spark SQL语法规则一致getItem:0起始索引,对应Spark底层API的索引规则
# 使用element_at实现 dfnew %>% select(my_first_element = element_at(C, 2)) # 使用getItem实现,和上面的写法效果完全一致 dfnew %>% select(my_first_element = getItem(C, 1))
两种方案都不需要生成中间列,最终提取结果和你之前用mutate提取的结果完全一致。
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

