类型不匹配:期望字符串,实际列

时间:2017-11-19 19:42:23

标签: scala apache-spark spark-dataframe

我正在使用Spark 2.2.0和Scala 2.11对我的DataFrame进行一些转换。

此代码行Math.abs($"right.product_price".asInstanceOf[Double] - $"left.product_price".asInstanceOf[Double])出现问题。我想计算left.product_priceright.product_price之间的绝对差值。如果其中任何一列包含null,则null会转换为0

但是,我收到一个错误:“类型不匹配:期望字符串,实际列”。 如何以正确的方式进行计算?

val result = df.as("left")
    // self-join by gender:
    .join(df.as("right"), ($"left.gender" === $"right.gender")
    // limit to 10 results per record:
    .withColumn("rn", row_number().over(Window.partitionBy($"left.product_PK").orderBy($"right.product_PK")))
    .filter($"rn <= 10").drop($"rn")
    // group and collect_list to create products column:
    .groupBy($"left.product_PK" as "product_PK")
    .agg(collect_list(struct($"right.product_PK", Math.abs($"right.product_price".asInstanceOf[Double] - $"right.product_price".asInstanceOf[Double]))) as "products")

1 个答案:

答案 0 :(得分:1)

您无法使用Math.abs,也无法使用asinstanceOf。使用SQL functions.abscast

import org.apache.spark.sql.functions.abs

...
  .agg(collect_list(struct(
     $"right.product_PK",
    abs($"right.product_price".cast("double)" - $"right.product_price".cast("double"))
  )) as "products")

要将null转换为0,请添加coalesce

import org.apache.spark.sql.functions.{coalesce, lit}

coalesce(column, lit(0))