2016-12-03 65 views
0

我想读取存储在HDFS中的Avro表,并指定也存储在HDFS中的模式 。 目前我有这样的解决方案,似乎工作:使用Spark-Java读取存储在HDFS中的Avro表和模式

RDD<String> stringRDD = sparkContext.textFile(schemaPath, 1); 
    String [] collect = (String []) stringRDD.collect(); 
    String schema = collect[0]; 
    Dataset<Row> df =sqlContext.read().format("com.databricks.spark.avro").option("avroSchema", schema) 
      .load(tablePath); 

这是做到这一点的最好方法是什么? 如果模式足够大以至于有2个分区会怎样?我应该使用reduce()将它们全部合并?

干杯

+0

为什么您需要首先阅读架构?可以在没有模式的情况下读取avro(因为模式嵌入在avro中)。您是否尝试过跳过架构选项? –

+0

模式也可以直接在类中描述(作为一个手工创建的字段),而不需要从外部文件获取它,它是一个选项吗? – Mironor

回答

0

我知道,它已经过了一年,因为这被问过,但我最近打算做同样的事情,这个问题在谷歌排名榜首了。

所以,我能够做到这一点使用Hadoop的FileSystem类:

import org.apache.avro.Schema; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.FSDataInputStream; 
import org.apache.hadoop.fs.Path; 

String schemaPath = "/path/to/schema/in/hdfs.avsc"; 
FSDataInputStream schemaFile = FileSystem.get(sparkContext.hadoopConfiguration).open(new Path(schemaPath)); 
Schema schema = new Schema.Parser().parse(schemaFile); 
String schemaString = schema.toString(); 

希望这有助于!