在Spark数据框中将一列乘以一个常数值

11

我在创建Spark dataframe的新列时遇到了问题。我尝试使用withColumn()创建新列,代码如下:

.withColumn('%_diff_from_avg', 
     ((col('aggregate_sales') - col('avg_sales')) / col('avg_sales') * 100))

计算结果中有一些数值被正确计算了,但是我的表格大部分数值都是空的。我不知道为什么。

有趣的是,当我从计算中删除 '* 100' 后,所有的值都被正确填充了 - 也就是说没有空值。例如:

.withColumn('%_diff_from_avg', 
    ((col('aggregate_sales') - col('avg_sales')) / col('avg_sales')))

看起来起作用了。

因此,似乎是乘以100导致了问题。

有人能解释一下为什么吗?


我用Scala尝试了相同的示例,对我来说看起来很好,我认为你的数据有问题,请检查一下。 - Sandeep Purohit
@SandeepPurohit 我在 Scala 中遇到了同样的问题。你能告诉我哪里出错了吗? - mythic
@nikitap,您能否详细解释一下问题? - Sandeep Purohit
对我来说问题在于,一些 Decimal 类型的值在乘以 100 后超过了 Decimal 类型允许的最大长度,因此被转换为 null。检查您字段的长度/类型,确保您使用了正确的类型来存储您尝试存储的值。 - W05aDePQw6h8e7
2个回答

12

这种情况我也遇到过。可能是你的列中包含了不同类型的数据导致的问题。试试这个:

.withColumn('%_diff_from_avg', 
     ((col('aggregate_sales') - col('avg_sales')) / col('avg_sales') * 100.0))

它对我起作用了。


3

你应该使用 lit() 包装常数。

.withColumn('%_diff_from_avg', 
     ((col('aggregate_sales') - col('avg_sales')) / col('avg_sales') * lit(100)))

测试过了,没问题。 - fishshrimp鱼虾爆栈

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接