代码之家  ›  专栏  ›  技术社区  ›  oluies

子字符串类型中的Spark Length函数不匹配

  •  0
  • oluies  · 技术社区  · 3 年前

    在Spark 3.0.1和Scala 2.12中,我得到了以下结果:

    import spark.implicits._
    import org.apache.spark.sql.functions._
    
    Seq(("1987.01.01"))
          .toDF("Input")
          .select( 
            col("Input"), 
            to_date(col("Input"), "yyyy.M.d").as("format"),
            length(col("Input")),
            substring(col("Input"),1, length(col("Input")).cast("int")+0 )
          ).show()
    
    
    
        command-1067744798817014:7: error: type mismatch;
         found   : org.apache.spark.sql.Column
         required: Int
            substring(col("Input"),1, length(col("Input")).cast("int")+0 )
                                                                  ^
    

    所以我想我有错误的“长度”函数,是通过隐式导入还是别的什么?

    这行得通

    Seq(("1987.01.01"))
      .toDF("Input")
      .select( 
        col("Input"), 
        to_date(col("Input"), "yyyy.M.d").as("format"),
        length(col("Input"))
      ).show()
    
    
    +----------+----------+-------------+
    |     Input|    format|length(Input)|
    +----------+----------+-------------+
    |1987.01.01|1987-01-01|           10|
    +----------+----------+-------------+
    
    1 回复  |  直到 3 年前
        1
  •  3
  •   mck    3 年前

    substring Scala API中的方法只接受第二个和第三个参数的整数。如果你想传递列,你需要使用 expr 使用Spark SQL API 子字符串 方法:

    Seq(("1987.01.01"))
          .toDF("Input")
          .select( 
            col("Input"), 
            to_date(col("Input"), "yyyy.M.d").as("format"),
            length(col("Input")),
            expr("substring(Input, 1, length(Input) + 0)")
          ).show()
    
    +----------+----------+-------------+----------------------------------------+
    |     Input|    format|length(Input)|substring(Input, 1, (length(Input) + 0))|
    +----------+----------+-------------+----------------------------------------+
    |1987.01.01|1987-01-01|           10|                              1987.01.01|
    +----------+----------+-------------+----------------------------------------+