Обработайте каждую строку, чтобы получить дату - PullRequest
0 голосов
/ 19 марта 2020

У меня есть файл, имеющий год и mon01, mon02

enter image description here

извлечение месяца с использованием двух последних символов из столбца (ie - 01 из MON01 ) длина текстового значения в соответствующих месяцах (MON01, MON02 ..) соответствует количеству дней в месяце. где получить дату для каждого 1 происходят.

like - 2018-01-02 (02 дня из-за 1 встречаются на 2-й день) 2018-01-03 2018-01-07

Как мы можем сделать это в spark- scala, чтобы получить результат?

Ответы [ 2 ]

1 голос
/ 19 марта 2020
    UDF:
    def myudf =(month:String,year:String ,value:String ) => {
        val month1 = month.replaceAll("[A-Za-z]+","")
        var date=1
        val dateList = ListBuffer[String]()
        for(char<-value){ 
          if(char=='1'){
           dateList += year+"-"+month1+"-"+date
          } else {
            dateList += ""
          }
          date += 1
        }
        dateList.filter(_.nonEmpty)
      }
    //Main Method
    val data = spark.read.option("header", "true").csv("data.csv")
    data.show()
    +----+-----+-----+
    |Year|Mon01|Mon02|
    +----+-----+-----+
    |2018|01110|00111|
    |2019|01100|00001|
    +----+-----+-----+
    val myCostumeudf = udf(myudf)
    val monthCols = data.columns.drop(1)
    val requiredDF = monthCols.foldLeft(data){
        case (df, month) =>
          df.withColumn("Date_"+month, myCostumeudf(lit(month),data("Year"),data(month)))
      }
    requiredDF.show(false)
    +----+-----+-----+---------------------------------+---------------------------------+
    |Year|Mon01|Mon02|Date_Mon01                       |Date_Mon02                       |
    +----+-----+-----+---------------------------------+---------------------------------+
    |2018|01110|00111|[2018-01-2, 2018-01-3, 2018-01-4]|[2018-02-3, 2018-02-4, 2018-02-5]|
    |2019|01100|00001|[2019-01-2, 2019-01-3]           |[2019-02-5]                      |
    +----+-----+-----+---------------------------------+---------------------------------+

Надеюсь, это поможет вам ..

0 голосов
/ 19 марта 2020
  1. получить список столбцов

     </p>
    
    <p>val cols = df.columns.toList 
        val res = cols.foldLeft(...) </p>
    
    <code>{  val filterDF = colWhere.foldLeft(pDYF){(tmpDF, colName) =>
        {
          val cn = s"${colName}_${colName}"
          val v: Option[String] = if (colName == "countries"
            || colName == "states"
            || colName == "zipCodes"
            || colName == "genders"
            || colName == "providers") {
            val vc = tmpDF.first().getAs[String](colName).asInstanceOf[mutable.WrappedArray[String]].map(x=>x).toArray
            val vc1: Option[String] = if(vc.length == 0) None else Some(vc.map(i=> s"$colName" + " = '" + i.toString + "'").mkString(" or "))
            vc1
          } else {
            val vc = tmpDF.first().getAs[Long](colName).asInstanceOf[mutable.WrappedArray[Long]].map(x=>x).toArray
            val vc1: Option[String] = if(vc.length == 0) None else Some(vc.map(i=> s"$colName" + " = " + i.toString).mkString(" or "))
            vc1
          }
      tmpDF.withColumn(cn, lit(v.getOrElse("")))
    }}}
    </code>
...