Amazon web services 在AWS Quicksight中可视化DynamoDB数据
我正在寻找一个以AWS为中心的解决方案(如果可能的话,避免使用第三方的东西)来可视化一个非常简单的DynamoDB表中的数据 我们使用AWS Quicksight为我们的客户提供许多其他报告和仪表盘,因此我们的目标是在那里提供可视化 我非常惊讶地看到,DynamoDB并不是Quicksight的支持源,尽管还有很多其他东西,如S3、Athena、Redshift、RDS等 有没有人有过为此创建解决方案的经验Amazon web services 在AWS Quicksight中可视化DynamoDB数据,amazon-web-services,amazon-dynamodb,amazon-quicksight,Amazon Web Services,Amazon Dynamodb,Amazon Quicksight,我正在寻找一个以AWS为中心的解决方案(如果可能的话,避免使用第三方的东西)来可视化一个非常简单的DynamoDB表中的数据 我们使用AWS Quicksight为我们的客户提供许多其他报告和仪表盘,因此我们的目标是在那里提供可视化 我非常惊讶地看到,DynamoDB并不是Quicksight的支持源,尽管还有很多其他东西,如S3、Athena、Redshift、RDS等 有没有人有过为此创建解决方案的经验 我在想,我将创建一个作业,每隔一段时间将DynamoDB表转储到S3,然后使用S3或雅典
我在想,我将创建一个作业,每隔一段时间将DynamoDB表转储到S3,然后使用S3或雅典娜与Quicksight的集成来读取/显示它。如果有一个简单的解决方案来提供更多实时数据,那就太好了。我还希望看到DynamoDB和QuickSight之间的本机集成,所以我也将关注这个线程 但至少有一个选项更接近你想要的。您可以在DynamoDB表上启用流,然后设置触发器,在对DynamoDB进行更改时触发Lambda函数 然后,如果愿意('Modify','Insert','Delete'),您只能对特定的DynamoDB事件采取操作,然后将新的/修改的记录转储到S3。这将非常接近实时数据,因为它会在更新后立即触发 我在过去做了类似的事情,但我没有将数据转储到S3,而是更新了另一个DynamoDB表。将示例切换到S3将非常简单。见下文
const AWS = require('aws-sdk');
exports.handler = async (event, context, callback) => {
console.log("Event:", event);
const dynamo = new AWS.DynamoDB();
const customerResponse = await dynamo.scan({
TableName: 'Customers',
ProjectionExpression: 'CustomerId'
}).promise().catch(err => console.log(err));
console.log(customerResponse);
let customers = customerResponse.Items.map(item => item.CustomerId.S);
console.log(customers);
for(let i = 0; i < event.Records.length; i++)
{
if(event.Records[i].eventName === 'INSERT')
{
if(event.Records[i].dynamodb.NewImage)
{
console.log(event.Records[i].dynamodb.NewImage);
for(let j = 0; j < customers.length; j++)
{
await dynamo.putItem({
Item: {
...event.Records[i].dynamodb.NewImage,
CustomerId: { S: customers[j] }
},
TableName: 'Rules'
}).promise().catch(err => console.log(err));
}
}
}
}
}
const AWS=require('AWS-sdk');
exports.handler=async(事件、上下文、回调)=>{
日志(“事件:”,事件);
const dynamo=新的AWS.DynamoDB();
const customerResponse=等待dynamo.scan({
TableName:'客户',
ProjectionExpression:“CustomerId”
}).promise().catch(err=>console.log(err));
console.log(customerResponse);
让customers=customerResponse.Items.map(item=>item.CustomerId.S);
console.log(客户);
for(设i=0;iconsole.log(err));
}
}
}
}
}
我们需要Quicksight中的DynamoDB支持
我能找到的最简单的方法如下:
1-创建一个Glue Crawler,它将DynamoDB表作为数据源,并将文档写入Glue表。(假设为表X)
2-创建一个以“表X”为数据源的粘合作业,并将其以拼花格式写入S3存储桶。(比如s3://table-x-parquets)
3-创建一个胶水爬虫程序,该爬虫程序将“s3://table-x-parquets”作为数据源,并从中创建一个新的胶水表。(比如说表Y)
现在,您可以在表Y中执行Athena查询,也可以将其用作Quicksight中的数据集。希望看到DynamoDB与Quicksight的集成。使用DynamoDB流转储到S3不起作用,因为DynamoDB流发送事件而不是更新记录。因此,如果您从这个S3存储桶中读取,您将拥有同一项的两个实例:一个在更新之前,一个在更新之后 我现在看到的一个解决方案是使用数据管道定期将数据从DynamoDB转储到S3存储桶,并在此S3存储桶上使用Athena和Quicksight 第二种解决方案是使用dynamo db stream,使用lambda函数将数据发送到弹性搜索。弹性搜索有一个名为Kibana的插件,它有非常酷的可视化效果。显然,这会增加您的成本,因为现在您将数据存储在两个地方
还要确保转换数据,使每个弹性搜索文档根据需要具有最细粒度的数据。正如kibana一样,可视化将所有内容聚合到一个文档中。!!更新强> 到2021年,我们终于可以让Athena Data connectors在Quicksight中公开DynamoDB数据,而无需任何自定义脚本或重复数据 :