2016-12-03 10 views
0

Я пытаюсь прочитать таблицу Avro, хранящуюся в HDFS, с указанием также схемы , которая также хранится в HDFS. На данный момент у меня есть это решение, которое, кажется, работает:Чтение таблицы и схемы Avro, хранящихся в HDFS, с использованием Spark-Java

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

Я знаю, что это был год, так как это было предложено, но я недавно надеюсь сделать то же самое и на этот вопрос пришли на первом место в Google.

Таким образом, я был в состоянии сделать это, используя FileSystem класса Hadoop в:

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(); 

Надеется, что это помогает!