spark从一个未知类型的任意列中减去一个整数

lskq00tm  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(514)

我试图从一个系统中获取任意sql语句作为输入,并在spark databricks集群中运行它。在这一点上,我的程序知道sql语句的支持表,并为查询加载了它们。但我遇到了一个问题,sql允许您从任意列中减去整数,而spark不允许。
我试图通过regex找到一种方法来替换 (T1.SomeColumn - 1) Spark当量;而不必完全剖析select语句来找出列来自哪个表及其数据类型。
我的问题是:spark中有没有一种方法可以从未知类型的任意列中减去一个整数(但要知道它在sql中工作)?

z9zf31ra

z9zf31ra1#

spark中的减法运算符与普通sql中的减法运算符相同,因此不需要替换它。
就减去任意列而言,spark内置了这种行为。基本上,spark将尝试将两个列转换为一个数字,然后执行减法。据我所知,字符串和布尔是唯一可以转换为数字的列。如果您尝试强制转换其他类型,它们将引发异常。请参见下面的示例:

import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._

val df = Seq(
  (1, "name"),
  (2, "name3"),
  (3, "15"),
  (4, "73.5"),
  (5, "0.2name"),
  (6, ".7")
).toDF("num", "str")

display(
  df
    .withColumn("numMinusStr", expr("num - str"))
    .withColumn("strMinusNum", expr("str - num"))
    .withColumn("castStringAsInt", lit("hi").cast(IntegerType))
    .withColumn("castBooleanAsInt", lit(true).cast(IntegerType))
//     .withColumn("structCol", struct(lit("a").as("a"), lit(3).as("b")))
//     .withColumn("numMinusStruct", expr("num - structCol"))
//   Throws: org.apache.spark.sql.AnalysisException: cannot resolve '(`num` - `structCol`)' due to 
//   data type mismatch: differing types in '(`num` - `structCol`)' (int and struct<a:string,b:int>).
)

输出:

如果有人试图从不能强制转换为整数的任意列中减去整数,您应该将错误返回到堆栈中的发送给您的人,因为查询无效。

相关问题