Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用可序列化函数读取大查询-如何从GenericRecord获取数字类型_Java_Google Bigquery_Apache Beam - Fatal编程技术网

Java 使用可序列化函数读取大查询-如何从GenericRecord获取数字类型

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 =

我使用Beam从BQ表中读取数据,发现使用SerializableFunction的read()比readTableRows()具有更好的性能。按照

我的大查询列是:

|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值)。输出可以是平均值,也可以是其他值(仍在编写管道)。感谢以色列,这正是我想要的!不确定如何“批准”或投票支持答案,但案件已结案。;)我想你可以接受我的回答为“你问题的答案”。更多信息:再次感谢以色列!完成;)