从Scala中的文件拆分记录时获取ArrayIndexOutOfBoundsException

时间:2018-03-15 08:15:17

标签: scala apache-spark rdd indexoutofboundsexception

我的文件包含以下记录:

11001^1^100^2015-06-05 22:35:21.543^<d><nv n="ExtStationID" v="Station/FYI Television, Inc./25102" /><nv n="MediaDesc" v="19b8f4c0-92ce-44a7-a403-df4ee413aca9" /><nv n="ChannelNumber" v="1366" /><nv n="Duration" v="24375" /><nv n="IsTunedToService" v="True" /><nv n="StreamSelection" v="FULLSCREEN_PRIMARY" /><nv n="ChannelType" v="LiveTVMediaChannel" /><nv n="TuneID" v="636007629215440000" /></d>^0122648d-4352-4eec-9327-effae0c34ef2^2016060601

我应该用文件^拆分文件。但我收到ArrayIndexOutOfBoundsException错误:

这是我的计划:

val spark = SparkSession.builder().appName("KPI 1").master("local").getOrCreate()
val data = spark.read.textFile("/some/path/to/Set_Top_Box_Data.txt").rdd

val raw = data.map{ record =>
  val rec = record.trim().toString.split("^")
  (rec(0),rec(2))
}
raw.collect().foreach(println)
spark.stop

这是相关的错误跟踪:

18/03/15 13:38:33 ERROR Executor: Exception in task 0.0 in stage 0.0 (TID 0)
java.lang.ArrayIndexOutOfBoundsException: 2
    at KPI1.FilterForId1001$$anonfun$1.apply(FilterForId1001.scala:12)
    at KPI1.FilterForId1001$$anonfun$1.apply(FilterForId1001.scala:11)
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:410)
    at scala.collection.Iterator$class.foreach(Iterator.scala:891)
    ...

2 个答案:

答案 0 :(得分:3)

你应该这样分开:

.split("\\^")

而不是

split("^")

答案 1 :(得分:2)

^是一个表示该行开头的正则表达式。

你需要逃避它,你应该好。

val raw = data.map{record=>{ val rec = record.trim().toString.split("\\^")
  (rec(0),rec(2))
}}