2017-07-19 1 views
0

Zeppelinに問題があります。私が作成した(データフレームの)魅力的なSQL操作を実行しようとすると、常にIndexOutOfBoundsエラーが発生します。ZeppelinのIndexOutOfBoundsエラー

ここに私のコードです:

import org.apache.commons.io.IOUtils 
import java.net.URL 
import java.nio.charset.Charset 
import org.apache.spark.sql.SparkSession 
//import sqlContext._ 

val realdata = sc.textFile("/root/application.txt") 

case class testClass(date: String, time: String, level: String, unknown1: String, unknownConsumer: String, unknownConsumer2: String, vloer: String, tegel: String, msg: String, sensor1: String, sensor2: String, sensor3: String, sensor4: String, sensor5: String, sensor6: String, sensor7: String, sensor8: String, batchsize: String, troepje1: String, troepje2: String) 

val mapData = realdata 
.filter(line => line.contains("data") && line.contains("INFO")) 
.map(s => s.split(" ").toList) 
.map(
s => testClass(s(0), 
s(1).split(",")(0), 
s(1).split(",")(1), 
s(3), 
s(4), 
s(5), 
s(6), 
s(7), 
s(8), 
s(15), 
s(16), 
s(17), 
s(18), 
s(19), 
s(20), 
s(21), 
s(22), 
"", 
"", 
"" 
) 
).toDF 
//mapData.count() 
//mapData.printSchema() 
mapData.registerTempTable("temp_carefloor") 

した後、次のノートに私のような単純なものを試してみてください。

%sql 
select * from temp_carefloor limit 10 

私は次のエラーを取得する:

java.lang.IndexOutOfBoundsException: 18 
    at scala.collection.LinearSeqOptimized$class.apply(LinearSeqOptimized.scala:65) 
    at scala.collection.immutable.List.apply(List.scala:84) 
    at $line128330188484.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$anonfun$3.apply(<console>:84) 
    at $line128330188484.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$anonfun$3.apply(<console>:72) 
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:409) 
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:409) 
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:409) 
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:232) 
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:225) 
    at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(RDD.scala:826) 
    at org.apache.spark.rdd.RDD$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(RDD.scala:826) 
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38) 
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:323) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:287) 
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87) 
    at org.apache.spark.scheduler.Task.run(Task.scala:99) 
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:282) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:748) 

今私は」私のデータが出力される方法と関係があることは確かです。 しかし、私は何が間違っているのか分かりませんし、私は本当にここで頭を打っています。本当に誰かが私を助けてくれることを願っています。

EDIT: ここに私が抽出しようとしている有用なデータの抜粋があります。

2016-03-10 07:18:58,985 INFO [http-nio-8080-exec-1] n.t.f.c.FloorUpdateController [FloorUpdateController.java:67] Floor 12FR received update from tile: 12G0, data = [false, false, false, false, true, false, false, false] 
2016-03-10 07:18:58,992 INFO [http-nio-8080-exec-7] n.t.f.c.FloorUpdateController [FloorUpdateController.java:67] Floor 12FR received update from tile: 12G0, data = [false, false, false, false, false, false, false, false] 
2016-03-10 07:18:59,907 INFO [http-nio-8080-exec-4] n.t.f.c.FloorUpdateController [FloorUpdateController.java:67] Floor 12FR received update from tile: 12G0, data = [false, false, false, false, false, false, false, false] 
2016-03-10 07:19:10,418 INFO [http-nio-8080-exec-9] n.t.f.c.FloorUpdateController [FloorUpdateController.java:67] Floor 12FR received update from tile: 12G0, data = [true, true, false, false, false, false, false, false] 

あなたはここでフルフラットファイルを見ることができます:http://upload.grecom.nl/uploads/jeffrey/application.txt

+1

確かにあなたのデータに問題があります。見てみることができるようにサンプルを提供してください –

+0

私はデータと完全なフラットファイルを見ることができるように私の質問を編集しました。ありがとうございました。 – Jdeboer

+1

最初に気づいたのは、行を '' "で区切って' 'tile:'や '='のようなフィールドに囲まれてしまうことです。スペースに囲まれているからです。 ? –

答えて

2

我々は問題がデータ分割にあるコメントで議論してきたように、あなたは" "でデータを分割することはできません。

一つの解決策は、あなたが正規表現のすべてのセパレータ(私が行ったようにあなたがそれらを抽出フィールドにしたくないでも部分文字列が含まれている必要があり、この" data = |tile: |[|]| |,"

のような正規表現を使用してデータを分割することです" data = "

希望します。宜しくお願いします。

+0

ありがとう、私はそれを書き直してみるつもりです – Jdeboer

+1

@ Jdeboerちょうど正しい式を得て正しい答えを作るときに答えを更新します –

+0

私は間違いなくそれをやります。私はちょうど今正しい正規表現を見つけるのに苦労しています。 – Jdeboer