DataFrameReader выдает «Неподдерживаемый тип NULL» при чтении файла avro - PullRequest
2 голосов
/ 10 октября 2019

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

org.apache.spark.sql.avro.IncompatibleSchemaException: неподдерживаемый тип 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 есть поле, определенное с помощью "type": "null". Я не создаю файлы, над которыми работаю, поэтому не могу изменить схему. Я могу читать файлы, когда использую RDD, и читать файл с помощью метода newAPIHadoopFile.

Есть ли способ прочитать файлы avro с "type": "null", используя Dataframe, или мне придется работатьс RDD?

1 Ответ

2 голосов
/ 10 октября 2019

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

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, но думаю, что вы можете управлять им.

...