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

如何在spark中执行不带dataframe的列表达式

  •  4
  • Kaushal  · 技术社区  · 8 年前

    有没有办法让我评估一下 Column 如果我只使用 Literal (没有数据帧列)。

    例如,类似于:

    val result: Int = someFunction(lit(3) * lit(5))
    //result: Int = 15
    

    或

    import org.apache.spark.sql.function.sha1
    val result: String = someFunction(sha1(lit("5")))
    //result: String = ac3478d69a3c81fa62e60f5c3696165a4e5e6ac4
    

    我可以使用数据帧计算

    val result = Seq(1).toDF.select(sha1(lit("5"))).as[String].first
    //result: String = ac3478d69a3c81fa62e60f5c3696165a4e5e6ac4
    

    但是有没有办法不使用dataframe就得到相同的结果呢?

    2 回复  |  直到 8 年前
        1
  •  6
  •   user6910411    8 年前

    要计算文字列,可以 convert it 给一个 Expression 和 eval 不提供 input 行:

    scala> sha1(lit("1").cast("binary")).expr.eval()
    res1: Any = 356a192b7913b04c54574d18c28d46e6395428ab
    

    只要函数是 UserDefinedFunction 它将以同样的方式工作:

    scala> val f = udf((x: Int) => x)
    f: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,IntegerType,Some(List(IntegerType)))
    
    scala> f(lit(3) * lit(5)).expr.eval()
    res3: Any = 15
    
        2
  •  -1
  •   Inder Manali    7 年前

    以下代码可以帮助您:

    val isUuid = udf((uuid: String) => uuid.matches("[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"))
    
    
    df.withColumn("myCol_is_uuid",isUuid(col("myCol")))
    .filter("myCol_is_uuid = true")
    .show(10, false)
    
    推荐文章