2014-09-23 75 views
3

我想解決這個問題,但無法進一步移動。任何人都可以請幫助Spark - Scala - saveAsHadoopFile拋出錯誤

import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat 

class KeyBasedOutput[T >: Null, V <: AnyRef] extends MultipleTextOutputFormat[T , V] { 
override def generateFileNameForKeyValue(key: T, value: V, leaf: String) = { 
key.toString 
} 
override def generateActualKey(key: T, value: V) = { 
null 
} 
} 

val cp1 =sqlContext.sql("select * from d_prev_fact").map(t => t.mkString("\t")).map{x => val parts =  x.split("\t") 
    val partition_key = parts(3) 
    val rows = parts.slice(0, parts.length).mkString("\t") 
    ("date=" + partition_key.toString, rows.toString)} 

cp1.saveAsHadoopFile(FACT_CP) 

我已經得到了如下錯誤,不能夠調試

scala> cp1.saveAsHadoopFile(FACT_CP,classOf[String],classOf[String],classOf[KeyBasedOutput[String, String]]) 
java.lang.RuntimeException: java.lang.NoSuchMethodException: $iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$KeyBasedOutput.<init>() 
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:131) 
    at org.apache.hadoop.mapred.JobConf.getOutputFormat(JobConf.java:709) 
    at org.apache.spark.rdd.PairRDDFunctions.saveAsHadoopDataset(PairRDDFunctions.scala:742) 
    at org.apache.spark.rdd.PairRDDFunctions.saveAsHadoopFile(PairRDDFunctions.scala:674) 

的想法是寫值到基於密鑰

+0

曾經找到了解決這個? – zengr 2015-11-14 00:17:34

回答

0

我多個文件夾米不確定,但我認爲類型擦除與反射相結合可能會給你造成這個問題。嘗試定義一個KeyBasedOutput的非泛型子類,它對類型參數進行硬編碼並使用它。

class StringKeyBasedOutput extends KeyBasedOutput[String, String] 
+0

這種方法不起作用,不應該是答案。 – zengr 2015-11-23 23:38:24

1

把KeyBasedOutput到一個罐子,並開始火花外殼--jars /路徑/到/的/罐