我有两个数据帧,如下所示,我需要这两个数据帧的第三个DF。
DF1
Name Value
abc 100
def 200
xyz 500
DF2
Name Share1 Share2
abc 50% 50%
def 25% 75%
xyz 0 100%
Resultant DF
Name Share1 Share2
abc 50 50
def 50 150
xyz 0 500
如何根据DF2的Share1和Share2列中的条件将DF1中的value列分为2列?
此处,DF1中的abc = 100,应在所得DF中将其50%分配给share1,将50%分配给share2。同样,在DF1中,def = 200的值应在结果DF中将25%分配给share1,将75%分配给share2。
答案 0 :(得分:0)
您需要加入两个dataframes
并应用UDF
来清理和计算份额值:
//UDF to remove % from the share columns & calculate the final value
sqlContext.udf().register("valueUDF", (UDF2<String, Integer, Double>) (share, value) -> {
Double sharePercent = Double.valueOf(share.replace("%", ""))/100;
return value * sharePercent;
}, DataTypes.DoubleType);
//join two dfs & apply the UDF on the same columns
Dataset<Row> result = df2.join(df1, "Name")
.withColumn("Share1", callUDF("valueUDF", col("Share1"), col("Value")))
.withColumn("Share2", callUDF("valueUDF", col("Share2"), col("Value")))
.drop("Value");
result.show();
输出:
+----+------+------+
|Name|Share1|Share2|
+----+------+------+
| abc| 50.0| 50.0|
| def| 50.0| 150.0|
| xyz| 0.0| 500.0|
+----+------+------+