在Spark sql中使用JDBC数据源,我们尝试在查询
下运行select nvl( columnName , 1.0) from tablename
给出错误
cannot resolve 'nvl(tablename.`columnname`, 1.0BD)' due to data type mismatch: input to function coalesce should all be the same type, but it's [decimal(38,10), decimal(2,1)]
我知道我们可以用
解决这个问题select nvl( columnname , CAST( 1.0 as decimal(38,10))) from tablename
看起来我需要找到每个列的数据类型并强制转换它。
答案 0 :(得分:2)
通过添加另一个select
将所有列转换为其他数据类型,这在dataframe / dataset API中很容易:
// Create some toy data.
val df = spark.range(100).select($"id", (rand(2) * 10).as("a"))
df.printSchema
// Define the casts.
val casts = Seq(col("id").cast("int"), col("a").cast("int"))
// Apply the casts.
df.select(casts: _*).printSchema