Sparksql, Java: Как манипулировать данными в одном столбце кадра данных на основе данных в другом столбце другого кадра данных? - PullRequest
0 голосов
/ 21 октября 2018

У меня есть два кадра данных, как показано ниже, и мне нужен третий 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

Как разделить столбец значений в DF1 на 2 столбца на основе критериев в столбцах Share1 и Share2DF2?

Здесь значение abc = 100 в DF1,50% должно идти на долю 1 и 50% на долю 2 в результирующем DF.Точно так же значение def = 200 в DF1, 25% из этого должно пойти на долю 1 и 75% на долю 2 в результирующем DF.

1 Ответ

0 голосов
/ 21 октября 2018

Вам необходимо объединить два 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|
+----+------+------+
...