spark - nvl函数数据类型不匹配错误

时间:2016-12-14 09:22:30

标签: apache-spark apache-spark-sql

在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

看起来我需要找到每个列的数据类型并强制转换它。

  1. 还有其他办法可以处理吗?
  2. 我可以在加载像csv格式的数据框时预先给出架构定义。 [https://issues.apache.org/jira/browse/SPARK-16848]
  3. 如何为每列转换加载的Dataframe数据类型。

1 个答案:

答案 0 :(得分:2)

  1. 您可以在NVL上使用Coalesce。合并的输入被投射到最好的'通用数据类型。
  2. JDBC连接使用数据库模式作为其模式,因此无法预先提供模式。
  3. 通过添加另一个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