Java 使用可序列化函数读取大查询-如何从GenericRecord获取数字类型
嗨 我使用Beam从BQ表中读取数据,发现使用SerializableFunction的read()比readTableRows()具有更好的性能。按照Java 使用可序列化函数读取大查询-如何从GenericRecord获取数字类型,java,google-bigquery,apache-beam,Java,Google Bigquery,Apache Beam,嗨 我使用Beam从BQ表中读取数据,发现使用SerializableFunction的read()比readTableRows()具有更好的性能。按照 我的大查询列是: |Field name | Field type| |Date_Time | TIMESTAMP | |Simple_Id | STRING | |A_Price | NUMERIC | 我的代码如下所示: PCollection<ProtoValueType> protoData =
我的大查询列是:
|Field name | Field type|
|Date_Time | TIMESTAMP |
|Simple_Id | STRING |
|A_Price | NUMERIC |
我的代码如下所示:
PCollection<ProtoValueType> protoData =
pipeline.apply("BigQuery Read",
BigQueryIO.read(new ConvertBQSchemaRecordToProtoDataFn())
.fromQuery(sqlQuery)
.usingStandardSql()
.withCoder(ProtoCoder.of(ProtoValueType.class)));
公共类ConvertBQSchemaRecordToProtoDataFn
实现SerializableFunction{
@Override
public ProtoValueType apply(SchemaAndRecord schemaAndRecord) {
GenericRecord avroRecord = schemaAndRecord.getRecord();
long dateTimeMillis = (Long) avroRecord.get("Date_Time");
String simpleId = avroRecord.get("Simple_Id").toString();
double aPrice = convertToDouble(avroRecord.get("A_Price").toString());
long和String很好。但是,当我尝试转换数值类型时,GenericRecord(来自调试器)将其显示为HeapByteBuffer,您无法强制转换。我不确定如何获取“a_Price”的值:
调用管道代码如下所示:
PCollection<ProtoValueType> protoData =
pipeline.apply("BigQuery Read",
BigQueryIO.read(new ConvertBQSchemaRecordToProtoDataFn())
.fromQuery(sqlQuery)
.usingStandardSql()
.withCoder(ProtoCoder.of(ProtoValueType.class)));
PCollection协议数据=
管道.apply(“BigQuery读取”,
read(新的ConvertBQSchemaRecordToProtoDataFn())
.fromQuery(sqlQuery)
.usingStandardSql()
.withCoder(ProtoCoder.of(ProtoValueType.class));
我不确定是否使用了编码器。ProtoValueType是protobuf生成的绑定类
我的问题是:如何从GenericRecord(我认为它是一个Avro对象)获取数值类型的值
非常感谢您的帮助。我可以使用readTableRows()获取该行,这些行都以字符串的形式返回,因此我不想了解该方法。与
数值
字段相对应的GenericRecord字段具有一些附加属性,您可以使用这些属性将数值
解析为java.math.BigDecimal
此类字段的架构将为BYTES
类型,如下所示:
{"type":"bytes","logicalType":"decimal","precision":38,"scale":9}
我刚刚发表了一篇博文,解释了如何使用模式中的这些属性将中的字节数组转换为java.math.BigDecimal
:
为了澄清,您正在从BigQuery读取数据,您在哪里编写输出?嗨,Alexandre,我正在从BigQuery读取数据,并将这些行转换为protobuf对象,然后将其传递到另一个函数中(例如,平均aPrice值)。输出可以是平均值,也可以是其他值(仍在编写管道)。感谢以色列,这正是我想要的!不确定如何“批准”或投票支持答案,但案件已结案。;)我想你可以接受我的回答为“你问题的答案”。更多信息:再次感谢以色列!完成;)