gpt4 book ai didi

scala - Spark : Applying UDF to Dataframe Generating new Columns based on Values in DF

转载 作者:行者123 更新时间:2023-12-04 02:06:52 25 4
gpt4 key购买 nike

我在 Scala 的 DataFrame 中转置值时遇到问题。我的初始 DataFrame 如下所示:

+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
| A| X| 6|null|
| B| Z|null| 5|
| C| Y| 4|null|
+----+----+----+----+

col1col2 是类型 Stringcol3col4Int.

结果应该是这样的:

+----+----+----+----+------+------+------+
|col1|col2|col3|col4|AXcol3|BZcol4|CYcol4|
+----+----+----+----+------+------+------+
| A| X| 6|null| 6| null| null|
| B| Z|null| 5| null| 5| null|
| C| Y| 4| 4| null| null| 4|
+----+----+----+----+------+------+------+

这意味着三个新列应以 col1col2 和提取值的列命名。提取的值来自列 col2col3col5,具体取决于哪个值不是 null

那么如何实现呢?我首先想到了这样的 UDF:

def myFunc (col1:String, col2:String, col3:Long, col4:Long) : (newColumn:String, rowValue:Long) = {
if col3 == null{
val rowValue=col4;
val newColumn=col1+col2+"col4";
} else{
val rowValue=col3;
val newColumn=col1+col2+"col3";
}
return (newColumn, rowValue);
}

val udfMyFunc = udf(myFunc _ ) //needed to treat it as partially applied function

但是我怎样才能以正确的方式从数据框中调用它呢?

当然,上面的所有代码都是垃圾,可能还有更好的方法。由于我只是在处理第一个代码片段,请告诉我...将 Int 值与 null 进行比较已经不起作用。

感谢任何帮助!谢谢!

最佳答案

还有一个更简单的方法:

val df3 = df2.withColumn("newCol", concat($"col1", $"col2")) //Step 1
.withColumn("value",when($"col3".isNotNull, $"col3").otherwise($"col4")) //Step 2
.groupBy($"col1",$"col2",$"col3",$"col4",$"newCol") //Step 3
.pivot("newCol") // Step 4
.agg(max($"value")) // Step 5
.orderBy($"newCol") // Step 6
.drop($"newCol") // Step 7

df3.show()

操作步骤如下:

  1. 添加一个新列,其中包含与 col2 连接的 col1 的内容
  2. //添加一个新列“value”,其中包含 col3 或 col4 的非空内容
  3. GroupBy你想要的列
  4. 以 newCol 为中心,其中包含现在要作为列标题的值
  5. 按值的最大值聚合,如果 groupBy 是每个组的单值,则最大值将是值本身;或者 .agg(first($"value")) 如果 value 恰好是字符串而不是数字类型 - max 函数只能应用于数字类型
  6. 按 newCol 排序,所以 DF 是升序
  7. 删除此列,因为您不再需要它,或者如果您想要一列没有空值的值,则跳过此步骤

归功于@user8371915,他首先帮助我回答了我自己的关键问题。

结果如下:

+----+----+----+----+----+----+----+
|col1|col2|col3|col4| AX| BZ| CY|
+----+----+----+----+----+----+----+
| A| X| 6|null| 6|null|null|
| B| Z|null| 5|null| 5|null|
| C| Y| 4| 4|null|null| 4|
+----+----+----+----+----+----+----+

您可能需要尝试连接列标题字符串才能获得正确的结果。

关于scala - Spark : Applying UDF to Dataframe Generating new Columns based on Values in DF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42643737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com