2016-10-17 4 views
0

Я пишу следующий код для загрузки файла в Spark с использованием API newAPIHadoopFile.Ошибка при использовании API «newAPIHadoopFile»

val lines = sc.newAPIHadoopFile("new_actress.list",classOf[TextInputFormat],classOf[Text],classOf[Text]) 

Но я получаю следующее сообщение об ошибке:

scala> val lines = sc.newAPIHadoopFile("new_actress.list",classOf[TextInputFormat],classOf[Text],classOf[Text]) 
<console>:34: error: inferred type arguments [org.apache.hadoop.io.Text,org.apache.hadoop.io.Text,org.apache.hadoop.mapred.TextInputFormat] do not conform to method newAPIHadoopFile's type parameter bounds [K,V,F <: org.apache.hadoop.mapreduce.InputFormat[K,V]] 
val lines = sc.newAPIHadoopFile("new_actress.list",classOf[TextInputFormat],classOf[Text],classOf[Text]) 
       ^
<console>:34: error: type mismatch; 
found : Class[org.apache.hadoop.mapred.TextInputFormat](classOf[org.apache.hadoop.mapred.TextInputFormat]) 
required: Class[F] 
val lines = sc.newAPIHadoopFile("new_actress.list",classOf[TextInputFormat],classOf[Text],classOf[Text]) 
                 ^
<console>:34: error: type mismatch; 
found : Class[org.apache.hadoop.io.Text](classOf[org.apache.hadoop.io.Text]) 
required: Class[K] 
val lines = sc.newAPIHadoopFile("new_actress.list",classOf[TextInputFormat],classOf[Text],classOf[Text]) 
                       ^
<console>:34: error: type mismatch; 
found : Class[org.apache.hadoop.io.Text](classOf[org.apache.hadoop.io.Text]) 
required: Class[V] 
val lines = sc.newAPIHadoopFile("new_actress.list",classOf[TextInputFormat],classOf[Text],classOf[Text]) 
                           ^

Что я делаю не так в коде?

ответ

2

TextInputFormat принимает <LongWritable,Text>.

Примечание: быть сосредоточены на расширяется участие в обоих **InputFormat

@InterfaceAudience.Public 
@InterfaceStability.Stable 
public class TextInputFormat 
extends FileInputFormat<LongWritable,Text> 

, что означает, что вы не можете установить оба типа для FileInputFormat как Text. Если вы хотите использовать FileInputFormat вам нужно сделать что-то вроде:

Вы можете попробовать:

import org.apache.hadoop.mapreduce.lib.input.TextInputFormat 
import org.apache.hadoop.io.Text 
import org.apache.hadoop.io.LongWritable 
val lines = sc.newAPIHadoopFile("test.csv", classOf[TextInputFormat], classOf[LongWritable], classOf[Text]) 

, но в случае, если вы все еще хотите использовать оба типа, как Text вы можете использовать KeyValueTextInputFormat который определяется как:

@InterfaceAudience.Public @InterfaceStability.Stable public class 
KeyValueTextInputFormat extends FileInputFormat<Text,Text> 

Вы можете попробовать:

import org.apache.hadoop.mapreduce.lib.input.KeyValueTextInputFormat 
import org.apache.hadoop.io.Text 
val lines = sc.newAPIHadoopFile("test.csv", classOf[KeyValueTextInputFormat], classOf[Text], classOf[Text]) 
+0

Спасибо ... еще одна вещь, есть ли разница между '' org.apache.hadoop.mapreduce.lib.input.TextInputFormat' и org.apache.hadoop.mapred.TextInputFormat'? Какой из них следует выбрать? – sarthak

+0

Проверьте http://stackoverflow.com/questions/16269922/hadoop-mapred-vs-hadoop-mapreduce – VladoDemcak