数据帧读取器在读取 avro 文件时抛出"Unsupported type NULL"



我正在尝试使用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 --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 文件:"null",否则我将不得不使用 RDD?

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

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

最新更新