2016-12-14 4 views
2

Использование JDBC DataSource в Спарк SQL мы пытаемся выполнить ниже запросискра - NVL функция типа данных ошибка несоответствия

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 для каждого столбца.

ответ

2
  1. Вы можете использовать Coalesce вместо этого на NVL. Входы для coalesce передаются в «лучший» общий тип данных.
  2. Соединение JDBC использует схему базы данных в качестве своей схемы, поэтому невозможно дать схему заранее.
  3. Вы бросили все столбцы в другой тип данных, добавив еще select, это легко в dataframe/набора данных 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 
    
+0

Спасибо за ответ. Я понимаю ответ для пунктов 1 и 2, в отношении пункта 3, что накладные расходы на действие «выбрать». –

+0

Накладные расходы 'select' низки (особенно при использовании генерации кода); вероятно, быстрее, чем преобразования, которые происходят в некоторых источниках данных. –

Смежные вопросы