r - SparkR groupBy 多列,每个列都应用过滤器
问题描述
我有一个包含超过 5 亿条记录的数据集。我想group by
在多个列上应用一个子句来获取计数。在分组时,我还需要确保结果计数仅适用于列中的特定值。
我有贷款表,其中有 customer_id、loan_id、installment_amt、installment_status Installment_status 包含多个值 'B'、'N'、'C'
在单个查询中,我想知道每个 customer_id、loan_id、分期付款的总数是多少、只有“B”的分期付款和有“C”的分期付款的数量是多少。
我是 SparkR 的新手,试图做以下类似的事情 -
RESULT <- summarize(
groupBy(LOAN, "customer_id", "loan_id"),
NO_OF_Installment=count(LOAN$installment_amt),
BILLED_INSTALLMENTS=count(LOAN$$installment_status=='B'),
CCANCELLED_INSTALLMENT=count(LOAN$$installment_status=='C')
)
它为 billed_installment 和 cancelled_installment 提供了相同的计数。
我不太确定计数时过滤是否有效。我在文档中看不到任何内容。但我已经看到这段代码在 R 中工作。
解决方案
我发现SparkR
使用管道的代码更容易阅读,因为它看起来更类似于 Python 或 Scala 版本,所以我将使用magrittr
.
library(magrittr)
基本思想是使用ifelse
方法。
在 SparkQL 中:
LOAN %>% createOrReplaceTempView('LOAN')
sql("
select customer_id, loan_id, count(installment_amt) as no_of_installment,
count(if(installment_status = 'B', 1, NULL)) as billed_installments,
count(if(installment_status = 'C', 1, NULL)) as cancelled_installments
from loan
group by customer_id, loan_id
") %>% summarize
在“本机”SparkR
中,它应该是:
LOAN %>% groupBy('customer_id', 'loan_id') %>%
summarize(
NO_OF_Installment = count(.$installment_amt),
BILLED_INSTALLMENTS = count(ifelse(.$installment_status == 'B', 1, NA)),
CANCELLED_INSTALLMENTS = count(ifelse(.$installment_status == 'C', 1, NA))
)
我不是 100% 确定您是否需要NA
或NULL
作为 中的no
值ifelse
,但我确实使用NA
.
至于为什么您自己的方法不起作用,我认为您的方法可以sum
代替count
.
count
NULL
计算一列中的非行数。LOAN$installment_status=='C'
是一boolean
列,所以它只会是NULL
if LOAN$installment_status
is NULL
。count
不关心列的实际值——它甚至不关心数据类型。
最接近的Rbase
等价于。是一样的。count
length
length(numeric(100))
length(logical(100))
相反,您可能更愿意将其视为sum
- base
R 等价物就像sum(installment_status == 'B')
. 在SparkR
中,这看起来像
sum(as.integer(.$installment_status == 'B'))
# or
sum(ifelse(.$installment_status == 'B', 1, 0))
不幸的是,虽然R 将类型base
隐式转换为when we ,但需要显式转换,因此这两种替代方法可以将 from 转换为显式。logical
integer
sum
SparkR
boolean
integer
推荐阅读
- lambda - 如何在 Java 8 中获取集合中嵌套元素的列表?
- c - TCP 数据报如何到达客户端计算机?
- javascript - R闪亮中的绝对面板隐藏在传单输出后面
- android - Volley 没有通过使用 StringRequest 的 POST 请求将参数附加到我的 url
- tensorflow - ValueError:使用密集层定义稀疏输入时
- javascript - 如何配置 Babel(或 Babel 插件)以自动将目录导入转换为目录内的文件?
- android - react-native: android: exitApp 让进程保持活动状态
- r - R错误中的ltm包
- php - 通过保存/更新时的自定义字段动态更改帖子永久链接
- javascript - 从 chrome.declarativeContent 访问 head 元素