Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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
Scala 如何使用Avro文件上的架构在Spark中加载Avros?_Scala_Hadoop_Avro_Apache Spark - Fatal编程技术网

Scala 如何使用Avro文件上的架构在Spark中加载Avros?

Scala 如何使用Avro文件上的架构在Spark中加载Avros?,scala,hadoop,avro,apache-spark,Scala,Hadoop,Avro,Apache Spark,我正在从Cloudera包裹运行CDH 4.4和Spark 0.9.0 我有一堆Avro文件,它们是通过Pig的AvroStorage UDF创建的。我想在Spark中加载这些文件,使用Avro文件上的通用记录或模式。到目前为止,我已经尝试过: import org.apache.avro.mapred.AvroKey import org.apache.avro.mapreduce.AvroKeyInputFormat import org.apache.hadoop.io.NullWrita

我正在从Cloudera包裹运行CDH 4.4和Spark 0.9.0

我有一堆Avro文件,它们是通过Pig的AvroStorage UDF创建的。我想在Spark中加载这些文件,使用Avro文件上的通用记录或模式。到目前为止,我已经尝试过:

import org.apache.avro.mapred.AvroKey
import org.apache.avro.mapreduce.AvroKeyInputFormat
import org.apache.hadoop.io.NullWritable
import org.apache.commons.lang.StringEscapeUtils.escapeCsv

import org.apache.hadoop.fs.Path
import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.conf.Configuration
import java.net.URI
import java.io.BufferedInputStream
import java.io.File
import org.apache.avro.generic.{GenericDatumReader, GenericRecord}
import org.apache.avro.specific.SpecificDatumReader
import org.apache.avro.file.DataFileStream
import org.apache.avro.io.DatumReader
import org.apache.avro.file.DataFileReader
import org.apache.avro.mapred.FsInput

val input = "hdfs://hivecluster2/securityx/web_proxy_mef/2014/05/29/22/part-m-00016.avro"
val inURI = new URI(input)
val inPath = new Path(inURI)

val fsInput = new FsInput(inPath, sc.hadoopConfiguration)
val reader =  new GenericDatumReader[GenericRecord]
val dataFileReader = DataFileReader.openReader(fsInput, reader)
val schemaString = dataFileReader.getSchema

val buf = scala.collection.mutable.ListBuffer.empty[GenericRecord]
while(dataFileReader.hasNext)  {
  buf += dataFileReader.next
}
sc.parallelize(buf)

这适用于一个文件,但无法扩展-我正在将所有数据加载到本地RAM中,然后将其分发到spark节点。

回答我自己的问题:

import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._

import org.apache.avro.generic.GenericRecord
import org.apache.avro.mapred.AvroKey
import org.apache.avro.mapred.AvroInputFormat
import org.apache.avro.mapreduce.AvroKeyInputFormat
import org.apache.hadoop.io.NullWritable
import org.apache.commons.lang.StringEscapeUtils.escapeCsv

import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.fs.Path
import org.apache.hadoop.conf.Configuration
import java.io.BufferedInputStream
import org.apache.avro.file.DataFileStream
import org.apache.avro.io.DatumReader
import org.apache.avro.file.DataFileReader
import org.apache.avro.file.DataFileReader
import org.apache.avro.generic.{GenericDatumReader, GenericRecord}
import org.apache.avro.mapred.FsInput
import org.apache.avro.Schema
import org.apache.avro.Schema.Parser
import org.apache.hadoop.mapred.JobConf
import java.io.File
import java.net.URI

// spark-shell -usejavacp -classpath "*.jar"

val input = "hdfs://hivecluster2/securityx/web_proxy_mef/2014/05/29/22/part-m-00016.avro"

val jobConf= new JobConf(sc.hadoopConfiguration)
val rdd = sc.hadoopFile(
  input,
  classOf[org.apache.avro.mapred.AvroInputFormat[GenericRecord]],
  classOf[org.apache.avro.mapred.AvroWrapper[GenericRecord]],
  classOf[org.apache.hadoop.io.NullWritable],
  10)
val f1 = rdd.first
val a = f1._1.datum
a.get("rawLog") // Access avro fields
这对我很有用:

import org.apache.avro.generic.GenericRecord
import org.apache.avro.mapred.{AvroInputFormat, AvroWrapper}
import org.apache.hadoop.io.NullWritable

...
val path = "hdfs:///path/to/your/avro/folder"
val avroRDD = sc.hadoopFile[AvroWrapper[GenericRecord], NullWritable, AvroInputFormat[GenericRecord]](path)

此解决方案一次仅适用于一个文件。我很难让hadoopRDD为多个文件工作。可以读取多个.avro文件的maven项目(在Cloudera Quickstart VM 5.0上测试)。不太确定相关的差异,但我注意到您的
SparkConf
可能不同,您的
JobConf
也可能不同,您可能需要设置`FileInputFormat.setInputPaths(conf,inPath)`?祝你假期愉快,期待下一期。我得到java.io.NotSerializableException:org.apache.avro.mapred.AvroWrapperGetting scala>import org.apache.avro.generic.GenericRecord:10:错误:object generic不是Spark 1.0.2和avro-1.7.7.jar中org.apache.avro.generic.GenericRecord包的成员,尽管我在这里看到了GenericRecord:。是什么给了???@matthieu您需要设置SPARK_CLASSPATH以包含avro.jar的位置,或者将其包含在SparkContext.addJar(“/path/to/avro.jar”)的新版本中,您需要在路径中包含主机名,例如,对于我的计算机,我使用
val path=”hdfs://localhost:9000//user/ganesh/default/bestsellingrank“