0

0

使用 Apache Beam DynamoDBIO 读取特定记录

花韻仙語

花韻仙語

发布时间:2025-08-08 18:22:14

|

520人浏览过

|

来源于php中文网

原创

使用 apache beam dynamodbio 读取特定记录

本文档旨在指导开发者在使用 Apache Beam DynamoDBIO SDK 从 DynamoDB 读取数据时,如何有效地过滤数据。我们将深入探讨 filterExpression 的使用方法,并解决可能出现的序列化问题,提供清晰的代码示例和实用建议,帮助您构建健壮的 Beam 管道。

使用 filterExpression 过滤 DynamoDB 数据

Apache Beam 提供了 DynamoDBIO 连接器,方便用户从 DynamoDB 读取数据。当需要读取特定记录时,可以使用 DynamoDB 的 filterExpression 功能。filterExpression 允许在扫描表时应用条件,从而只返回满足条件的记录。

以下代码展示了如何使用 filterExpression 来过滤 DynamoDB 数据:

import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.io.aws2.dynamodb.DynamoDBIO;
import org.apache.beam.sdk.coders.ListCoder;
import org.apache.beam.sdk.coders.MapCoder;
import org.apache.beam.sdk.coders.StringUtf8Coder;
import org.apache.beam.sdk.transforms.SerializableFunction;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.ScanRequest;
import software.amazon.awssdk.services.dynamodb.model.ScanResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Collections;
import org.apache.beam.sdk.options.PipelineOptions;
import org.apache.beam.sdk.options.PipelineOptionsFactory;

public class DynamoDBReadExample {

    public static void main(String[] args) {
        PipelineOptions options = PipelineOptionsFactory.fromArgs(args).withValidation().create();
        Pipeline pipeline = Pipeline.create(options);

        Map expressionAttributeValues = new HashMap<>();
        expressionAttributeValues.put(":message", AttributeValue.builder().s("Ping").build());

        pipeline
                .apply(DynamoDBIO.>>read()
                        .withClientConfiguration(DynamoDBConfig.CLIENT_CONFIGURATION)
                        .withScanRequestFn(input -> ScanRequest.builder().tableName("SiteProductCache").totalSegments(1)
                                .filterExpression("KafkaEventMessage = :message")
                                .expressionAttributeValues(expressionAttributeValues)
                                .projectionExpression("key, KafkaEventMessage")
                                .build())
                        .withScanResponseMapperFn(new ResponseMapper())
                        .withCoder(ListCoder.of(MapCoder.of(StringUtf8Coder.of(), AttributeValue.builder().build().coder())))
                )
                .apply(/* Your transformation here */);

        pipeline.run().waitUntilFinish();
    }

    static final class ResponseMapper implements SerializableFunction>> {
        @Override
        public List> apply(ScanResponse input) {
            if (input == null) {
                return Collections.emptyList();
            }
            return input.items();
        }
    }
}

代码解释:

  1. expressionAttributeValues: 定义了一个 Map,用于存储表达式中使用的属性值。在这个例子中,:message 对应的值是 "Ping"。
  2. ScanRequest.builder(): 创建一个 ScanRequest 对象,用于配置 DynamoDB 的扫描操作。
    • tableName("SiteProductCache"): 指定要扫描的表名。
    • totalSegments(1): 指定扫描的总分片数。
    • filterExpression("KafkaEventMessage = :message"): 设置过滤表达式,只返回 KafkaEventMessage 等于 ":message" 的记录。
    • expressionAttributeValues(expressionAttributeValues): 将定义的属性值映射传递给扫描请求。
    • projectionExpression("key, KafkaEventMessage"): 指定要返回的属性,这里只返回 "key" 和 "KafkaEventMessage" 属性。
  3. ResponseMapper: 一个实现了 SerializableFunction 接口的类,用于将 ScanResponse 转换为 List>。

注意事项:

  • 确保 DynamoDBConfig.CLIENT_CONFIGURATION 包含了正确的 DynamoDB 客户端配置信息。
  • 根据实际情况调整 tableName、filterExpression、expressionAttributeValues 和 projectionExpression。
  • Coder需要和实际返回数据类型匹配,否则会报序列化错误。

解决序列化问题

在使用 Apache Beam 时,需要特别注意序列化问题。如果在 Lambda 表达式中使用了外部变量,可能会导致 NotSerializableException 异常。

问题原因:

WeWedding婚纱影楼小程序
WeWedding婚纱影楼小程序

婚纱影楼小程序提供了一个连接用户与影楼的平台,相当于影楼在微信的官网。它能帮助影楼展示拍摄实力,记录访客数据,宣传优惠活动。使用频率高,方便传播,是影楼在微信端宣传营销的得力助手。功能特点:样片页是影楼展示优秀摄影样片提供给用户欣赏并且吸引客户的。套系页是影楼根据市场需求推出的不同套餐,用户可以按照自己的喜好预定套系。个人中心可以查看用户预约的拍摄计划,也可以获取到影楼的联系方式。

下载

Lambda 表达式会捕获其所在作用域中的变量。如果这些变量没有实现 Serializable 接口,那么在 Beam 管道执行过程中,尝试序列化这些变量时就会抛出异常。

解决方法

  1. 将 Lambda 表达式替换为静态内部类: 将 Lambda 表达式替换为一个静态内部类,并将需要的变量作为类的成员变量传递进去。
  2. 在 Lambda 表达式内部初始化变量: 尽量在 Lambda 表达式内部初始化变量,避免从外部传递非序列化对象。

示例:

如果 expressionAttributeValues 导致了序列化问题,可以尝试在 ScanRequestFn 内部初始化它:

.withScanRequestFn(input -> {
    Map expressionAttributeValues = new HashMap<>();
    expressionAttributeValues.put(":message", AttributeValue.builder().s("Ping").build());

    return ScanRequest.builder().tableName("SiteProductCache").totalSegments(1)
            .filterExpression("KafkaEventMessage = :message")
            .expressionAttributeValues(expressionAttributeValues)
            .projectionExpression("key, KafkaEventMessage")
            .build();
})

总结:

通过本文档,您应该能够掌握如何使用 Apache Beam DynamoDBIO SDK 读取特定记录,并解决可能出现的序列化问题。请记住,在编写 Beam 管道时,务必注意序列化问题,并采取相应的解决方法。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

301

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

lambda表达式
lambda表达式

Lambda表达式是一种匿名函数的简洁表示方式,它可以在需要函数作为参数的地方使用,并提供了一种更简洁、更灵活的编码方式,其语法为“lambda 参数列表: 表达式”,参数列表是函数的参数,可以包含一个或多个参数,用逗号分隔,表达式是函数的执行体,用于定义函数的具体操作。本专题为大家提供lambda表达式相关的文章、下载、课程内容,供大家免费下载体验。

204

2023.09.15

python lambda函数
python lambda函数

本专题整合了python lambda函数用法详解,阅读专题下面的文章了解更多详细内容。

190

2025.11.08

Python lambda详解
Python lambda详解

本专题整合了Python lambda函数相关教程,阅读下面的文章了解更多详细内容。

47

2026.01.05

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1018

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

63

2025.10.17

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
RunnerGo从入门到精通
RunnerGo从入门到精通

共22课时 | 1.7万人学习

尚学堂Mahout视频教程
尚学堂Mahout视频教程

共18课时 | 3.2万人学习

Linux优化视频教程
Linux优化视频教程

共14课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号