IntelliJ 在 udf 函数上构建了一个有 2 个错误的项目 - 没有可用于 Option[Seq[Testclass]] 的 TypeTag

Posted

技术标签:

【中文标题】IntelliJ 在 udf 函数上构建了一个有 2 个错误的项目 - 没有可用于 Option[Seq[Testclass]] 的 TypeTag【英文标题】:IntelliJ built a project with 2 errors on udf function - No TypeTag available for Option[Seq[Testclass]] 【发布时间】:2019-04-16 11:06:32 【问题描述】:

我正在通过 IntelliJ 为 Scala 程序构建产品。 我构建了另一个产品,没有任何错误。

我没有任何其他尝试,因为这是我第一次使用class/udf构建那种代码,我只是得到了一些代码的参考

    case class Testclass(
                      col1:Option[java.sql.Timestamp],
                      col2:Option[String],
                      col3:Option[Int],
                      col4:Option[Long],
                      col5:Option[Double],
                    )

    val function = udf((l: Seq[Row], id: String, ts: Timestamp) => scala.util.Try 
      l
        .filter(c => id.isEmpty || c.getAs[String]("order_transaction_id").equalsIgnoreCase(id))
        .filter(c => if (ts != null) c.getAs[Timestamp]("jump_timestamp").before(ts) else true)
        .map  c =>
          Testclass(
            if (!c.isNullAt(0)) Some(c.getAs[Timestamp](0)) else None,
            if (!c.isNullAt(1)) Some(c.getString(1)) else None,
            if (!c.isNullAt(2)) Some(c.getInt(2)) else None,
            if (!c.isNullAt(3)) Some(c.getLong(3)) else None,
            if (!c.isNullAt(4)) Some(c.getDouble(4)) else None
          )
        
        .sortWith((c1, c2) => c1.his_ts.get.before(c2.his_ts.get))
    .toOption)

    val dataFrame2 = dataFrame1
      .withColumn("column_ABC", function(col("event_lists"), col("event_string"), col("event_timestamp")))
    //source is a parquet file, but a little similar with json format
    //event_lists is an array for this parquet, all the elements are same as the definition of Testclass
    //event_string is a string field
    //event_timestamp is a timestamp field

预期结果:构建应该成功且没有任何错误

【问题讨论】:

对不起,我忘记附上错误日志了: Error:(149, 40) No TypeTag 可用于 Option[Seq[Testclass]] val function = udf((l: Seq[Row], id: String, ts: Timestamp) => scala .util.Try 错误:(149, 40) 方法 udf 的参数不足:( 隐含证据 $8: reflect.runtime.universe.TypeTag[Option[Seq[Testclass]]] ,隐含证据 $9: 反映。 runtime.universe.TypeTag[Seq[org.apache.spark.sql.Row]],隐含证据$10:reflect.runtime.universe.TypeTag[String],隐含证据$11:reflect.runtime.universe.TypeTag[java.sql .Timestamp])org.apache.spark.sql.expressions.UserDefinedFunction。未指定值参数evidence$8,evidence$9,evidence$10... val function = udf((l: Seq[Row], id: String, ts: Timestamp) => scala.util.Try 【参考方案1】:

对不起,我想通了

只要把代码和大师班放在同一级别

case class Testclass(
                  col1:Option[java.sql.Timestamp],
                  col2:Option[String],
                  col3:Option[Int],
                  col4:Option[Long],
                  col5:Option[Double],
                )

【讨论】:

以上是关于IntelliJ 在 udf 函数上构建了一个有 2 个错误的项目 - 没有可用于 Option[Seq[Testclass]] 的 TypeTag的主要内容,如果未能解决你的问题,请参考以下文章

如何使用代理与 Snowpark 会话构建器连接到雪花

在另一个 UDF 中调用 UDF

一套 Spark UDF 实践教程(文末专栏抽奖)

pyspark:在同一列(使用数组)上使用多个 UDF 函数时出现意外行为

在 Application.Evaluate 中使用多个 UDF 函数

在每个函数调用上导入 Redshift Python UDF