DataFrameReader在读取Avro文件时抛出“ Unsupported type NULL”

时间:2019-10-10 09:33:00

标签: apache-spark apache-spark-sql google-cloud-dataproc spark-avro

我正在尝试使用DataFrame读取avro文件,但一直在获取:

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-打包org.apache.spark:spark-avro_2.11:2.4.0 --master本地[*] --class MainClass my-spak-app.jar

运行了大量测试后,我得出结论,这是因为我的avro模式中有一个用“ type”:“ null”定义的字段。我没有创建正在处理的文件,所以无法更改架构。使用RDD时,我可以读取文件,并使用newAPIHadoopFile方法读取文件。

是否可以使用Dataframe读取“类型”:“空”的avro文件,否则我将不得不使用RDD?

1 个答案:

答案 0 :(得分:2)

读取文件时可以指定架构。为文件创建架构

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语法不是很熟悉,但是我认为您可以管理它。