2014-09-23 3 views
3

Я хотел бы устранить проблему, но не мог двигаться дальше. Может кто-нибудь, пожалуйста, помогитеSpark - Scala - saveAhadoopFile throwing error

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

ответ

0

I» я не уверен, но я думаю, что стирание стилей в сочетании с отражением может вызвать эту проблему для вас. Попробуйте определить не общий подкласс KeyBasedOutput, который жестко кодирует параметры типа и использует его.

class StringKeyBasedOutput extends KeyBasedOutput[String, String] 
+0

Этот подход не работает, не должен быть ответом. – zengr

1

Поместите KeyBasedOutput в банку и начать искровую оболочка --jars/путь/к/с/банкой