我正在使用spark 2.1.0和hadoop 2.7.3。
我试图在main方法的一个类中使用newAPIHadoopFile,非常简单的代码:
val spark = SparkSession.builder().appName("test").master("local[*]").getOrCreate()
val sparkContext = spark.sparkContext
val sparkConf = sparkContext.getConf
val file = "src/main/resources/chat.csv"
sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
sparkContext.getConf.registerKryoClasses(Array(
Class.forName("org.apache.hadoop.io.LongWritable"),
Class.forName("org.apache.hadoop.io.Text")
));
sparkConf.set("spark.kryo.classesToRegister", "org.apache.hadoop.io.LongWritable, org.apache.hadoop.io.Text")
val rdd = sparkContext.newAPIHadoopFile(file, classOf[KeyValueTextInputFormat], classOf[Text], classOf[Text])
rdd.collect().foreach(println)
我检查了StackOverflow中的很多帖子,但仍然出现错误:
java.io.NotSerializableException: org.apache.hadoop.io.Text
Serialization stack:
- object not serializable (class: org.apache.hadoop.io.Text, value: How about Italian?"})
- field (class: scala.Tuple2, name: _1, type: class java.lang.Object)
- object (class scala.Tuple2, ( How about Italian?"},))
- element of array (index: 0)
- array (class [Lscala.Tuple2;, size 3)
at org.apache.spark.serializer.SerializationDebugger$.improveException(SerializationDebugger.scala:40)
编辑:chat.csv的内容:
{from:"Gert", to:"Melissa", message:"Want to have dinner?"}
{from:"Melissa", to:"Gert", message:"Ok\
How about Italian?"}
答案 0 :(得分:0)
我在我的机器上运行了与spark 1.6.0提供的相同代码并且工作正常(我在HDFS中使用了制表符分隔文件)。你正在使用什么版本的spark / hadoop?
在某些情况下(可能是较低版本)Text不实现可序列化。所以在将它映射到String之前再试一次,
如下所示,newAPIhadoopFile的结果将是键值的元组,
rdd.map(x=>(x._1.toString,x._2.toString)).collect().foreach(println)
试试这个。
REF:click here