我想使用Spark阅读avro文件(我使用的是Spark 1.3.0,因此我没有数据框)
我使用这段代码阅读了avro文件
import org.apache.avro.generic.GenericRecord
import org.apache.avro.mapred.AvroKey
import org.apache.avro.mapreduce.AvroKeyInputFormat
import org.apache.hadoop.io.NullWritable
import org.apache.spark.SparkContext
private def readAvro(sparkContext: SparkContext, path: String) = {
sparkContext.newAPIHadoopFile[
AvroKey[GenericRecord],
NullWritable,
AvroKeyInputFormat[GenericRecord]
](path)
}
我执行此操作并获得RDD。现在从RDD,我如何提取特定列的值?喜欢循环遍历所有记录并给出列名的值吗?
[编辑]正如Justin在下面所建议的,我试过
val rdd = sc.newAPIHadoopFile[AvroKey[GenericRecord], NullWritable, AvroKeyInputFormat[GenericRecord]](input)
rdd.map(record=> record._1.get("accountId")).toArray().foreach(println)
但是我收到了错误
<console>:34: error: value get is not a member of org.apache.avro.mapred.AvroKey[org.apache.avro.generic.GenericRecord]
rdd.map(record=> record._1.get("accountId")).toArray().foreach(println)
答案 0 :(得分:1)
AvroKey
有datum
方法来提取包装值。 GenericRecord
有get
方法,可以将列名称作为字符串接受。因此,您只需使用map
rdd.map(record=>record._1.datum.get("COLNAME"))