2015-10-29 55 views
1

我想讀的使用星火的Avro的文件(我使用的Spark 1.3.0所以我沒有數據幀)閱讀的Avro文件,並提取列的值

我用這塊讀取的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.3.0 _does_有DataFrames只提取列:https://spark.apache.org/docs/1.3.0/sql-programming-guide.html –

+0

是有一種方法可以在spark 1.3.0數據框中加載avro文件?我沒有看到您提供的文檔鏈接中的任何內容。 –

回答

1

AvroKey具有datum方法以提取包裹值。而GenericRecord有一個get方法,它接受列名作爲字符串。所以,你可以使用map

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

我嘗試了你的建議並更新了我的問題。我收到關於'get'函數的錯誤。我在Cloudera平臺上使用Spark 1.3.0。 –