首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将StructType转换为Avro架构,在使用数据库spark-avro时将类型返回为Union

将StructType转换为Avro架构,在使用数据库spark-avro时将类型返回为Union
EN

Stack Overflow用户
提问于 2018-12-04 20:12:11
回答 1查看 2.2K关注 0票数 1

我正在使用databricks spark-avro将数据帧模式转换为avro schema.The返回的avro模式没有默认值。

代码语言:javascript
复制
Dataset<Row> sellableDs = sparkSession.sql("sql query");
SchemaBuilder.RecordBuilder<Schema> rb = SchemaBuilder.record("testrecord").namespace("test_namespace");
Schema sc = SchemaConverters.convertStructToAvro(sellableDs.schema(), rb, "test_namespace");
System.out.println(sc.toString());
System.out.println(sc.getFields().get(0).toString());
String schemaString = sc.toString();
sellableDs.foreach(
    (ForeachFunction<Row>) row -> {
        Schema scEx = new Schema.Parser().parse(schemaString);
        GenericRecord gr;
        gr = new GenericData.Record(scEx);
        System.out.println("Generic record Created");
        int fieldSize = scEx.getFields().size();
        for (int i = 0; i < fieldSize; i++ ) {
            // System.out.println( row.get(i).toString());
            System.out.println("field: " + scEx.getFields().get(i).toString() + "::" + "value:" + row.get(i));
            gr.put(scEx.getFields().get(i).toString(), row.get(i));
            //i++;
        }
    }
);

这是df模式:

代码语言:javascript
复制
StructType(StructField(key,IntegerType,true), StructField(value,DoubleType,true))

这是avro转换后的模式:

代码语言:javascript
复制
{"type":"record","name":"testrecord","namespace":"test_namespace","fields":[{"name":"key","type":["int","null"]},{"name":"value","type":["double","null"]}]}
EN

回答 1

Stack Overflow用户

发布于 2018-12-04 22:01:13

问题是SchemaConverters类在模式创建过程中没有包含默认值。您有两种选择,一种是修改模式,在创建记录之前添加默认值,另一种是在构建某些值之前填充记录(实际上可以是您的行中的值)。例如null。这是如何使用您的方案创建记录的示例

代码语言:javascript
复制
import org.apache.avro.generic.GenericRecordBuilder 
import org.apache.avro.Schema
var schema = new Schema.Parser().parse("{\"type\":\"record\",\"name\":\"testrecord\",\"namespace\":\"test_namespace\",\"fields\":[{\"name\":\"key\",\"type\":[\"int\",\"null\"]},{\"name\":\"value\",\"type\":[\"double\",\"null\"]}]}")


var  builder = new GenericRecordBuilder(schema);

for (i <- 0 to schema.getFields().size() - 1 ) {
  builder.set(schema.getFields().get(i).name(), null)
}

var record = builder.build();
print(record.toString())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53612711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档