当前位置: 首页 > 知识库问答 >
问题:

DataFrameReader在读取avro文件时抛出“不支持的类型NULL”

徐昕
2023-03-14

我试图用DataFrame读取一个avro文件,但不断得到:

< I > org . Apache . spark . SQL . avro . incompatible schema exception:不支持的类型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方法读取文件。

有没有办法使用Dataframe读取带有“type”:“null”的avro文件,否则我将不得不使用RDD?

共有1个答案

阚原
2023-03-14

您可以在读取文件时指定模式。为您的文件创建一个模式

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

 类似资料:
  • 我是自动化的一个API的POST调用使用Rest保证和内容类型和ACCEPT头我必须使用"应用程序/vnd.apijson"。但是每次我使用“应用程序/vnd.apijson”,我都会得到415个状态代码。尽管使用邮递员的相同POST呼叫工作得非常好。 以下是我的示例代码: 以下是收到的答复 我曾尝试将Content-Type更改为应用程序/json,正如其他帖子/评论所建议的那样,但这似乎对我的

  • 我试图将一个包含PDF BLOB的MS SQL字段导入SOLR,并出现以下错误: 处理时出现异常:附件文档:SolrInputDocument(字段:[]):org。阿帕奇。索尔。汉德勒。数据导入。DataImportHandlerException:java。lang.RuntimeException:不支持的类型:class java。在org.String。阿帕奇。索尔。汉德勒。数据导入。D

  • 我想在Android项目中使用logback-android。这是我所做的 null 谢谢你!

  • 我在Pyspark中使用UDF时遇到以下问题。 只要我不使用任何UDF,我的代码就能正常工作。执行简单的操作(如选择列)或使用sql函数(如concat)都没有问题。只要我对使用udf数据帧执行操作,程序就会崩溃,并出现以下异常: 我的代码里没有什么花哨的东西。我只是定义了一个简单的udf函数,它应该返回列“gender”中的一系列值。 我不确定这是否重要,但我在Mac上使用Pycharm。

  • avro.version= 在avro模式中,map type不支持缺省值。我尝试了以下不同的模式。 第一: 第二: 第三: Java代码如下: 我只希望constraintQuantities和RawQuanties为null。因为这些是可选字段。即使我没有将它们设置为null,它也会抛出异常。 最重要的是,方法生成java POJO,但无法构建该对象。 如果不设置它们为空,然后接收以下异常:

  • 我知道已经有一个类似的问题,但它没有解决上述错误。 这是我在API控制器中的PUT操作,在中运行良好: 以下是我的网页上的代码: HTML 打字稿 我的服务是: 我还使用了尝试上述问题的答案,我将我的文件附加到中,但不幸的是,同样的错误。如果媒体类型中没有任何设置,如何修复此问题?