【发布时间】:2019-08-13 02:46:03
【问题描述】:
目前,我们有一个迭代使用 withColumn 的代码。 When-Otherwise 条件检查,我们在此基础上进行算术计算。
示例代码:
df.withColumn("col4", when(col("col1")>10, col("col2").+col("col3")).otherwise(col("col2")))
对于另外 40 列,其他算术计算以迭代方式发生。 总记录数 - 2M。
重复的代码:
df.withColumn(colName1, when((col(amountToSubtract).<("0")) && (col(colName1).===("0")) && (col(amountToSubtract).<=(col(colName2))) && (col(colName2).!==("0")), col(colName2)).otherwise(col(colName1))).
withColumn(amountToSubtract, when(col(amountToSubtract).!==("0"), col(amountToSubtract).-(col(colName2))).otherwise(col(amountToSubtract))).
withColumn(colName1, when((col(amountToSubtract).>("0")) && (col(colName1).===("0")), col(colName2).+(col(amountToSubtract))).otherwise(col(colName1))).
withColumn(amountToSubtract, when((col(amountToSubtract).>("0")) && (col(colName1).===("0")), "0").otherwise(col(amountToSubtract)))
随后进行 7 或 8 组其他计算。
此时作业挂起的时间更长。有时它会引发 GC 开销错误。 意识到 .withColumn 的迭代使用不利于性能,我找不到实现上述条件检查的替代方法。请协助。
【问题讨论】:
-
您可以使用 foldleft 并添加具有相同逻辑的列。您获取列列表并使用数据框作为零元素应用 foldleft。在 foldleft 中应用 withColumn 方法。
-
@firas 感谢您的意见!我提到的重复代码 sn-p 是一个块。并且相同的 4 块 withColumns 又被使用了 8 次。因此,我发现使用 FoldLeft 很难实现它。如果可以,请为我的示例代码分享一个示例 foldleft - 我可能会进一步扩展它。
-
我发布了答案。如果有帮助,你能把它标记为好。如果没有告诉我,我会尝试更新。
-
@firas Havent 尝试了您的解决方案。因为 UDF 对我来说更熟悉,所以我已经尝试过这里提供的其他解决方案。下周将尝试您的建议。将让您保持不变。
标签: scala dataframe apache-spark apache-spark-sql