这个Spark / Scala代码的正确索引是什么?

时间:2017-08-11 00:18:20

标签: scala apache-spark

我刚开始使用Spark和Scala。我从头开始用手写下面的内容,但它非常接近我正在做的一个例子。当我运行它时,当我对代码进行更改时,我不断收到看似彼此冲突的错误。我正在寻找根据旅行目的分组驱动的里程数。非常简单但无论我设置字段的索引如何,它似乎永远不会幸福。如果我将它设置为(fields(6).toString,fields(5).toFloat),我会得到一个超出范围的异常。如果我将它设置为(fields(5).toString,fields(4).toFloat),那么显然是错误的索引值。这是数据的方案:

start date: date time
end date: date time
category: string
start: string
stop: string
miles: float
purpose: string

以下是代码:

package net.massstreet

import org.apache.spark.SparkContext._
import org.apache.spark._
import org.apache.log4j._

object InitializeSparkApp {



  /** Convert input data to (customerID, amountSpent) tuples */
  def extractCustomerPricePairs(line: String) = {
    val fields = line.split(",")
    (fields(5).toString, fields(4).toFloat)
  }


     def main(args: Array[String]){

       Logger.getLogger("org").setLevel(Level.ERROR)

       val sc = new SparkContext("local[*]","First App")

       val data = sc.textFile("data/uber_data.csv")

       val mappedInput = data.map(extractCustomerPricePairs)

       val totalMilesByPurpose = mappedInput.reduceByKey((x,y) => (x + y))

       totalMilesByPurpose.foreach(println)

     }

}

1 个答案:

答案 0 :(得分:0)

如果您的数据缺少milespurpose

start date, end date, category, start, stop, , 
start date, end date, category, start, stop, miles,

以下代码不会读取行尾的空值

val fields = line.split(",")

您可以-1读取空值,直到行尾为

val fields = line.split(",", -1)

查看您的计划start date: date time,end date: date time,category: string,start: string,stop: string,miles: float,purpose: string

(fields(6).toString, fields(5).toFloat)似乎是正确的,因为当你分割一条线时,它将被转换为一个从0索引开始的数组。因此,为了更安全,您可以在返回Try时使用Optiontuple

 (Try(fields(6)) getOrElse("Empty"), Try(fields(5).toFloat) getOrElse(0F))

OR

(Option(fields(6)) getOrElse("Empty"), Option(fields(5).toFloat) getOrElse(0F))