Sparksql,Java:如何根据另一数据框的另一列中的数据来操纵数据框的一列中的数据?

时间:2018-10-21 12:41:01

标签: apache-spark apache-spark-sql spark-java

我有两个数据帧,如下所示,我需要这两个数据帧的第三个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。

1 个答案:

答案 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|
+----+------+------+