我有一个用例,我想把一个struct字段转换成avro记录。struct字段最初Map到avro类型。输入数据是avro文件,struct字段对应于输入avro记录中的一个字段。
下面是我想用伪代码实现的。
DataSet<Row> data = loadInput(); // data is of form (foo, bar, myStruct) from avro data.
// do some joins to add more data
data = doJoins(data); // now data is of form (a, b, myStruct)
// transform DataSet<Row> to DataSet<MyType>
DataSet<MyType> myData = data.map(row -> myUDF(row), encoderOfMyType);
// method `myUDF` definition
MyType myUDF(Row row) {
String a = row.getAs("a");
String b = row.getAs("b");
// MyStruct is the generated avro class that corresponds to field myStruct
MyStruct myStruct = convertToAvro(row.getAs("myStruct"));
return generateMyType(a, b, myStruct);
}
我的问题是:如何实施 convertToAvro
上述伪代码中的方法?
1条答案
按热度按时间ax6ht2ek1#
根据文件:
avro包提供函数给\u avro将一列编码为avro格式的二进制,并从\u avro()将avro二进制数据解码为一列。这两个函数都将一列转换为另一列,并且输入/输出sql数据类型可以是复杂类型或基元类型。
_avro的函数充当
convertToAvro
方法:印刷品
要将avro列转换回,可以使用来自\u avro的函数:
输出:
关于udf的一句话:在这个问题中,您在udf中执行了到avro格式的转换。我更希望在udf中只包含实际的业务逻辑,并将格式转换保留在外部。这将逻辑和格式转换分开。如果需要,可以删除原始列
mystruct
在创建avro列之后。