Меньше, чем сравнение для даты в искры Scala RDD - PullRequest
0 голосов
/ 02 октября 2018

Я хочу напечатать данные сотрудников, которые присоединились до 1991 года. Ниже приведены мои примеры данных:

69062,FRANK,ANALYST,5646,1991-12-03,3100.00,,2001
63679,SANDRINE,CLERK,69062,1990-12-18,900.00,,2001 

Начальная СДР для загрузки данных:

val rdd=sc.textFile("file:////home/hduser/Desktop/Employees/employees.txt").filter(p=>{p!=null && p.trim.length>0})

UDF для преобразования столбца строкина текущий столбец:

def convertStringToDate(s: String): Date = {
        val dateFormat = new SimpleDateFormat("yyyy-MM-dd")
        dateFormat.parse(s)
    }

Отображение каждого столбца в его тип данных:

val dateRdd=rdd.map(_.split(",")).map(p=>(if(p(0).length >0 )p(0).toLong else 0L,p(1),p(2),if(p(3).length > 0)p(3).toLong else 0L,convertStringToDate(p(4)),if(p(5).length >0)p(5).toDouble else 0D,if(p(6).length > 0)p(6).toDouble else 0D,if(p(7).length> 0)p(7).toInt else 0))  

Теперь я получаю данные в кортежах, как показано ниже:

(69062,FRANK,ANALYST,5646,Tue Dec 03 00:00:00 IST 1991,3100.0,0.0,2001)
(63679,SANDRINE,CLERK,69062,Tue Dec 18 00:00:00 IST 1990,900.0,0.0,2001)

Сейчаскогда я выполняю команду, я получаю ошибку ниже:

scala> dateRdd.map(p=>(!(p._5.before("1991")))).foreach(println)
<console>:36: error: type mismatch;
 found   : String("1991")
 required: java.util.Date
              dateRdd.map(p=>(!(p._5.before("1991")))).foreach(println)

                                        ^

Так, где я иду не так ???

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Так как вы работаете с rdd и без df и у вас есть строки даты с простой проверкой даты, следующий несложный способ для СДР:

val rdd = sc.parallelize(Seq((69062,"FRANK","ANALYST",5646, "1991-12-03",3100.00,2001),(63679,"SANDRINE","CLERK",69062,"1990-12-18",900.00,2001)))
rdd.filter(p=>(p._5 < "1991-01-01")).foreach(println)
0 голосов
/ 03 октября 2018

Нет необходимости конвертировать дату в устаревшие форматы SimpleDate.Используйте Java.time.Поскольку 4-й столбец находится в ожидаемом формате ISO, вы можете просто использовать приведенный ниже шаг rdd.Проверьте это

val rdd=spark.sparkContext.textFile("in\\employees.txt").filter( x => {val y = x.split(","); java.time.LocalDate.parse(y(4)).isBefore(java.time.LocalDate.parse("1991-01-01")) } )

rdd.collect.foreach(println)

дал следующий результат

63679,SANDRINE,CLERK,69062,1990-12-18,900.00,,2001

надеюсь, это ответ на ваш вопрос.

EDIT1:

Использование библиотек Java 7 и SimpleFormat

import java.util.Date
import java.text.SimpleDateFormat
import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
import org.apache.spark._
import org.apache.spark.sql.types._
import org.apache.spark.sql._
object DTCheck{
  def main(args:Array[String]): Unit = {

    def convertStringToDate(s: String): Date = {
      val dateFormat = new SimpleDateFormat("yyyy-MM-dd")
      dateFormat.parse(s)
    }
    Logger.getLogger("org").setLevel(Level.ERROR)
    val spark = SparkSession.builder().appName("Employee < 1991").master("local[*]").getOrCreate()

    val  sdf = new SimpleDateFormat("yyyy-MM-dd")
    val dt_1991 = sdf.parse("1991-01-01")

    import spark.implicits._
    val rdd=spark.sparkContext.textFile("in\\employees.txt").filter( x => {val y = x.split(","); convertStringToDate(y(4)).before(dt_1991 ) } )
    rdd.collect.foreach(println)
  }
}
...