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

Spark Avro到拼花地板在数字字段中写入空值

徐秋月
2023-03-14

我将火花数据框保存为拼花文件,数据框具有从avro对象构建的行。相同的确切html" target="_blank">代码在这里-https://stackoverflow.com/a/41491999/2440775

我面临的挑战是,我希望能够在传入数据中缺少整数字段时具有空值。Avro似乎允许使用Union类型,但当我不指定默认值或在avsc中指定默认值为"null"时,我会得到以下错误:

Caused by: org.apache.avro.AvroRuntimeException: Field xxx type:LONG pos:7 not set and has no default value
    at org.apache.avro.generic.GenericData.getDefaultValue(GenericData.java:984)
    at org.apache.avro.data.RecordBuilderBase.defaultValue(RecordBuilderBase.java:135)

Or

Caused by: org.apache.avro.AvroRuntimeException: Field xxx type:UNION pos:7 not set and has no default value
    at org.apache.avro.generic.GenericData.getDefaultValue(GenericData.java:984)
    at org.apache.avro.data.RecordBuilderBase.defaultValue(RecordBuilderBase.java:135)

如果我写一个默认值“0”,那么it saveAspQuet工作得很好

我还尝试更改avro规范,使其首先具有“null”类型,因为union选择了第一个元素的类型。

"type": ["null","long"], "default": null

这会导致以下异常:

org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 1 times, most recent failure: Lost task 0.0 in stage 0.0 (TID 0, localhost): java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Long

在avro模式中更改long和null的顺序会导致以下异常

引起原因:org.apache.avro.AvroTypeExc0019:非数值默认值为long:null

共有1个答案

督嘉言
2023-03-14

我没有这样的解决方案,但找到了一个解决方法。我从avro对象构建行的方式是从avro对象创建一个列表,然后执行一行。关于那件事。解决方法检查默认值0和数据类型int或long。如果是默认值,则添加null。因此,在选择默认值时必须小心。

public static List avroToList(AvroData a) throws UnsupportedEncodingException{
        List l = new ArrayList<>();
        for (Schema.Field f : a.getSchema().getFields()) {
            Object value = a.get(f.name());
            if (value == null) {
                l.add(null);
            }
            else {
                switch (f.schema().getType().getName()){
                    case "union":
                        l.add(value.toString());
                        break;

                    case "int":
                        if(value == 0) {l.add(null);}
                        else {l.add(Integer.valueOf(value.toString()));}
                      break;

                    case "long":
                        if(value == 0L) {l.add(null);}
                        else {l.add(Long.valueOf(value.toString()));}
                        break;

                    default:l.add(value);
                        break;
                }

            }
        }
        return l;
    }

avsc文件的类型信息如下

"type": "long",  "default": 0
 类似资料:
  • 我是大数据生态系统的新手,有点起步。 我读过几篇关于使用spark流媒体阅读Kafka主题的文章,但我想知道是否可以使用spark作业而不是流媒体阅读Kafka主题?如果是的话,你们能帮我指出一些可以让我开始学习的文章或代码片段吗。 问题的第二部分是以拼花格式向hdfs写信。一旦我读了Kafka的书,我想我会有一个rdd。将此rdd转换为数据帧,然后将数据帧写入拼花文件。这是正确的方法吗。 感谢您

  • Spark版本:2.3 hadoop dist:azure Hdinsight 2.6.5平台:azure存储:BLOB 集群中的节点:6个执行器实例:每个执行器6个内核:每个执行器3个内存:8gb 试图通过同一存储帐户上的spark数据框将azure blob(wasb)中的csv文件(大小4.5g-280列,2.8 mil行)加载到拼花格式。我重新划分了大小不同的文件,即20、40、60、10

  • 如果我写信 临时工。拼花文件夹我得到了和行号相同的文件号 我想我不太了解拼花地板,但它是自然的吗?

  • 由于,我检查了一个spark作业的输出拼花文件,该作业总是会发出声音。我在Cloudera 5.13.1上使用了 我注意到拼花地板排的大小是不均匀的。第一排和最后一排的人很多。剩下的真的很小。。。 拼花地板工具的缩短输出,: 这是已知的臭虫吗?如何在Spark中设置拼花地板块大小(行组大小)? 编辑: Spark应用程序的作用是:它读取一个大的AVRO文件,然后通过两个分区键(使用

  • 如何将数据帧中的数据写入到单个。拼花地板文件(两个数据 df.rdd.get1个分区 1个 如果我使用上述命令在HDFS中创建拼花文件,它将在HDFS中创建目录“payloads.parquet”,并在该目录中创建多个文件。拼花地板文件,元数据文件正在保存。 找到4项 如何将数据帧中的数据写入单个文件(两个数据 帮助将不胜感激。

  • 我是Spark的初学者,试图理解Spark数据帧的机制。当从csv和parquet加载数据时,我比较了spark sql dataframe上sql查询的性能。我的理解是,一旦数据加载到spark数据框中,数据的来源(csv或parquet)应该无关紧要。然而,我看到了两者之间的显著性能差异。我使用以下命令加载数据,并对其编写查询。 请解释差异的原因。