DataFrameReader выдает неподдерживаемый тип NULL при чтении файла avro

Я пытаюсь прочитать файл avro с помощью DataFrame, но продолжаю получать:

org.apache.spark.sql.avro.IncompileSchemaException: неподдерживаемый тип NULL

Поскольку я собираюсь развернуть его на Dataproc, я использую Spark 2.4.0, но то же самое произошло, когда я попробовал другие версии.

Ниже приведены мои зависимости:

 <dependencies>
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_2.11</artifactId>
            <version>${spark.version}</version>
            <scope>provided</scope>
        </dependency>
 </dependencies>

Мой основной класс:

public static void main(String[] args) {

        SparkConf sparkConf = new SparkConf()
                .setAppName("Example");

        SparkSession spark = SparkSession
                .builder()
                .appName("Java Spark SQL basic example")
                .getOrCreate();

        Dataset<Row> rowDataset = spark.read().format("avro").load("avro_file");

   }

Запуск команды:

spark-submit --packages org.apache.spark:spark-avro_2.11:2.4.0 --master local[*] --class MainClass my-spak-app.jar

Проведя множество тестов, я пришел к выводу, что это происходит потому, что в моей схеме avro есть поле, определенное с «типом»: «null». Я не создаю файлы, над которыми работаю, поэтому не могу изменить схему. Я могу читать файлы, когда использую RDD, и читаю файл с помощью метода newAPIHadoopFile.

Есть ли способ читать файлы avro с «типом»: «null» с помощью Dataframe или мне придется работать с RDD?


person ohaionm    schedule 10.10.2019    source источник
comment
Глядя на функцию преобразования схемы Spark, действительно кажется, что тип Avro null не поддерживается. Одним из обходных путей, который можно попробовать, было бы пропустить вывод схемы, предоставив схему вручную?   -  person Muton    schedule 10.10.2019
comment
Спасибо за ответ, он работал так: spark.read().option(avroSchema, schema).format(avro).load(avro_file); Теперь я пытаюсь преобразовать полученный набор данных «Строка» в набор данных моего собственного объекта. Я пробовал as(Encoders.bean(MyClass.class)) но получил: UnsupportedOperationException: не может иметь циклические ссылки в классе компонентов, но получил циклическую ссылку класса класса org.apache.avro.Schema   -  person ohaionm    schedule 10.10.2019


Ответы (1)


Вы можете указать схему при чтении файла. Создайте схему для вашего файла

val ACCOUNT_schema = StructType(List(
    StructField("XXX",DateType,true),
    StructField("YYY",StringType,true))


val rowDataset = spark.read().format("avro").option("avroSchema", schema).load("avro_file");

Я не очень хорошо знаком с синтаксисом java, но думаю, вы справитесь.

person Saswat    schedule 10.10.2019
comment
Спасибо за ответ, он работал так: spark.read().option(avroSchema, schema).format(avro).load(avro_file); Теперь я пытаюсь преобразовать полученный набор данных «Строка» в набор данных моего собственного объекта. Я пробовал as(Encoders.bean(MyClass.class)) но получил: UnsupportedOperationException: не может иметь циклические ссылки в классе компонентов, но получил циклическую ссылку класса класса org.apache.avro.Schema - person ohaionm; 10.10.2019
comment
Возможно, на вас влияет issues.apache.org/jira/browse/AVRO-695. - можете попробовать обновить версию avro? - person Aniket Mokashi; 11.10.2019