【发布时间】:2017-06-03 15:43:08
【问题描述】:
我有一个数据框 df,其中包含以下数据:
**customers** **product** **Val_id**
1 A 1
2 B X
3 C
4 D Z
我提供了两条规则,如下:
**rule_id** **rule_name** **product value** **priority**
123 ABC A,B 1
456 DEF A,B,D 2
要求是按优先级顺序将这些规则应用于数据帧 df,通过规则 1 的客户不应考虑使用规则 2,并在最终数据帧中添加另外两列 rule_id 和 rule_name,我已经编写了下面的代码来实现它:
val rule_name = when(col("product").isin("A","B"), "ABC").otherwise(when(col("product").isin("A","B","D"), "DEF").otherwise(""))
val rule_id = when(col("product").isin("A","B"), "123").otherwise(when(col("product").isin("A","B","D"), "456").otherwise(""))
val df1 = df_customers.withColumn("rule_name" , rule_name).withColumn("rule_id" , rule_id)
df1.show()
最终输出如下:
**customers** **product** **Val_id** **rule_name** **rule_id**
1 A 1 ABC 123
2 B X ABC 123
3 C
4 D Z DEF 456
有没有更好的方法来实现它,只需遍历整个数据集一次而不是遍历整个数据集两次来添加两列?
【问题讨论】:
标签: scala apache-spark apache-spark-sql