@ Бхарат Нет, это не закруглится. Для этого проверьте документы Spark на функцию округления или вы можете создать для нее отдельный UDF.

учаю ошибку:

org.apache.spark.sql.analysisexception: cannot resolve 'year'

Мои входные данные:

1,2012-07-21,2014-04-09

Мой код:

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._
import org.apache.spark.sql.SaveMode
import org.apache.spark.sql._
import org.apache.spark.sql.functions._
case class c (id:Int,start:String,end:String)
val c1 = sc.textFile("date.txt")
val c2 = c1.map(_.split(",")).map(r=>(c(r(0).toInt,r(1).toString,r(2).toString)))
val c3 = c2.toDF();
c3.registerTempTable("c4")
val r = sqlContext.sql("select id,datediff(year,to_date(end), to_date(start)) AS date from c4")

Что я могу сделать, чтобы устранить ошибку выше?

Я попробовал следующий код, но я получил вывод в днях, и мне нужно в годах

val r = sqlContext.sql("select id,datediff(to_date(end), to_date(start)) AS date from c4")

Пожалуйста, сообщите мне, если я могу использовать любую функцию, такую ​​как to_date, чтобы получить разницу в году.

 Missy19 сент. 2017 г., 17:30
Разделить на 365? Существует также часть даты, которая позволяет указывать годы. Видетьdocs.microsoft.com/en-us/sql/t-sql/functions/... Google твой друг.
 user851053620 сент. 2017 г., 16:27
Спасибо за ваш вклад. я попытался разделить на 365, используя @Missy UDF
 jamiet26 окт. 2017 г., 14:49
Ссылка на docs.microsoft.com относится к T-SQL (т. Е. Процедурному языку, используемому в SQL Server), но не относится к Spark.

Ответы на вопрос(2)

нитьSQL даты и время функции на столбцы, как показано ниже:

import org.apache.spark.sql.types._
val c4 = c3.select(col("id"),col("start").cast(DateType),col("end").cast(DateType))

c4.withColumn("dateDifference", datediff(col("end"),col("start")))
  .withColumn("monthDifference", months_between(col("end"),col("start")))
  .withColumn("yearDifference", year(col("end"))-year(col("start")))
  .show()
 Bharath 12 окт. 2017 г., 21:45
Привет Ришикеш. Что произойдет, если разница будет, скажем, 9 лет и 10 месяцев. Будет ли округлять до 10 лет?
 Rishikesh Teke13 окт. 2017 г., 14:27
@ Бхарат Нет, это не закруглится. Для этого проверьте документы Spark на функцию округления или вы можете создать для нее отдельный UDF.
Решение Вопроса
val r = sqlContext.sql("select id,datediff(year,to_date(end), to_date(start)) AS date from c4")

т. Е. Он не является допустимым столбцом в таблице «с4», поэтому возникает исключение анализа, поскольку запрос недействителен, запрос не может найти «год» колонка.

Используйте SparkПользовательская функция (UDF)Это будет более надежный подход.

 jamiet26 окт. 2017 г., 14:53
@AshSr Функция datediff () в SparkSQL не имеетinterval параметр (или аналог) на момент написания.

Ваш ответ на вопрос