我正在尝试使用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?
答案 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语法不是很熟悉,但是我认为您可以管理它。