Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 读取Spark中的Avro文件并提取列值_Apache Spark_Avro - Fatal编程技术网

Apache spark 读取Spark中的Avro文件并提取列值

Apache spark 读取Spark中的Avro文件并提取列值,apache-spark,avro,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.apach

我想使用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中,如何提取特定列的值?比如循环遍历所有记录并给出列名的值

[编辑]根据下面贾斯汀的建议,我尝试了

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)
:34:错误:value get不是org.apache.avro.mapred.AvroKey[org.apache.avro.generic.genericord]的成员
map(record=>record.get(“accountId”).toArray().foreach(println)

AvroKey
有一个
数据
方法来提取包装值。而
genericord
有一个
get
方法,该方法将列名作为字符串接受。因此,您可以使用
map

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

我尝试了你的建议并更新了上面的问题。我得到一个关于
get
函数的错误。我在Cloudera平台上使用Spark 1.3.0。Spark 1.3.0有数据帧:有没有办法在Spark 1.3.0数据帧中加载avro文件?我在您提供的文档链接中没有看到任何内容。