java读取存储在hdfs中的avro表和模式

2nc8po8w  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(482)

我试图读取一个存储在hdfs中的avro表,该表还指定了存储在hdfs中的模式。目前,我有一个似乎有效的解决方案:

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()合并所有这些文件吗?
干杯

watbbzwu

watbbzwu1#

我知道已经有一年没有人问过这个问题了,但我最近也在想做同样的事情,这个问题在google上出现了。
所以,我可以使用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();

希望这有帮助!

7kjnsjlb

7kjnsjlb2#

使用spark 2.1.1的另一种方法

import org.apache.avro.Schema
val avroSchema = spark.sparkContext.wholeTextFiles(source).take(1)(0)._2
val schema = new Schema.Parser().parse(avroSchema)

相关问题