在Spark中读取Avro文件并提取列值

时间:2015-10-29 20:34:24

标签: apache-spark avro

我想使用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)

1 个答案:

答案 0 :(得分:1)

AvroKeydatum方法来提取包装值。 GenericRecordget方法,可以将列名称作为字符串接受。因此,您只需使用map

提取列
rdd.map(record=>record._1.datum.get("COLNAME"))