本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
日记账导出输出于 QLDB
重要
终止支持通知:现有客户将能够使用亚马逊,QLDB直到 2025 年 7 月 31 日终止支持。有关更多详细信息,请参阅将亚马逊QLDB账本迁移到亚马逊 Aurora Postgr SQL
除了包含您的QLDB日记块的数据对象外,Amazon 日记导出任务还会写入两个清单文件。这些文件都保存在导出请求指定的 Amazon S3 存储桶中。以下章节介绍每个输出对象的格式和内容。
注意
如果您指定JSON导出任务的输出格式,则在导出的数据对象JSON中QLDB将 Amazon Ion 日志数据向下转换为。有关更多信息,请转至 向下转换为 JSON。
清单文件
Amazon 在提供的 S3 存储桶中为每个导出请求QLDB创建两个清单文件。初始清单文件将在您提交导出请求后立即创建。最终清单文件是在导出完成后写入的。您可以使用这些文件来检查 Amazon S3 中导出作业的状态。
清单文件内容的格式与请求的导出输出格式相对应。
初始清单
初始清单表明您的导出作业已启动。它包含您传递给请求的输入参数。除了 Amazon S3 目标以及导出的开始和结束时间参数外,此文件还包含一个 exportId
。exportId
是QLDB分配给每个导出任务的唯一 ID。
文件命名约定如下。
s3://amzn-s3-demo-bucket/prefix
/exportId
.started.manifest
下面是 Ion 文本格式的初始清单文件及其内容示例。
s3://amzn-s3-demo-bucket/journalExport/8UyXulxccYLAsbN1aon7e4.started.manifest
{
ledgerName:"my-example-ledger",
exportId:"8UyXulxccYLAsbN1aon7e4",
inclusiveStartTime:2019-04-15T00:00:00.000Z,
exclusiveEndTime:2019-04-15T22:00:00.000Z,
bucket:"amzn-s3-demo-bucket",
prefix:"journalExport",
objectEncryptionType:"NO_ENCRYPTION",
outputFormat:"ION_TEXT"
}
outputFormat
只有在导出请求中指定时,初始清单才会包含该清单。如果您没有指定输出格式,导出的数据将默认为 ION_TEXT
。
DescribeJournalS3Export API 操作和导出的 Amazon S3 对象的内容类型也表明了输出格式。
最终清单
最终清单表示特定日记账链的导出作业已完成。导出作业为每个分支写入一个单独的最终清单文件。
注意
在 Amazon 中QLDB,分支是账本日记账的分区。QLDB目前仅支持单链日记。
最终清单包括导出期间写入的数据对象密钥的有序列表。文件命名约定如下。
s3://amzn-s3-demo-bucket/prefix
/exportId
.strandId
.completed.manifest
strandId
是QLDB分配给链的唯一 ID。下面是 Ion 文本格式的最终清单文件及其内容示例。
s3://amzn-s3-demo-bucket/journalExport/8UyXulxccYLAsbN1aon7e4.JdxjkR9bSYB5jMHWcI464T.completed.manifest
{
keys:[
"2019/04/15/22/JdxjkR9bSYB5jMHWcI464T.1-4.ion",
"2019/04/15/22/JdxjkR9bSYB5jMHWcI464T.5-10.ion",
"2019/04/15/22/JdxjkR9bSYB5jMHWcI464T.11-12.ion",
"2019/04/15/22/JdxjkR9bSYB5jMHWcI464T.13-20.ion",
"2019/04/15/22/JdxjkR9bSYB5jMHWcI464T.21-21.ion"
]
}
数据对象
Amazon 以 Amazon Ion 的文本或二进制格式或JSON行文本格式在提供的 Amazon S3 存储桶中QLDB写入日记数据对象。
在 Lin JSON es 格式中,导出的数据对象中的每个块都是由换行符分隔的有效JSON对象。您可以使用这种格式将JSON导出内容直接与分析工具集成,例如 Amazon Athena 和 AWS Glue 因为这些服务可以自动解析以换行符JSON分隔。有关格式的更多信息,请参阅JSON行
数据对象名称
日记账导出作业使用以下命名约定写入这些数据对象。
s3://amzn-s3-demo-bucket/prefix
/yyyy/mm/dd/hh/strandId
.startSn
-endSn
.ion|.json
-
每个导出作业的输出数据都被分成多个块。
-
yyyy/mm/dd/hh
— 您提交导出请求的日期和时间。在同一小时内导出的对象是按相同的 Amazon S3 前缀进行分组。 -
strandId
— 包含要导出的日记账区块的特定链的唯一 ID。 -
startSn-endSn
— 对象中包含的序列号范围。序列号指定区块在链中的位置。
例如,假设您指定以下路径。
s3://amzn-s3-demo-bucket/journalExport/
您的导出作业会创建一个类似于以下的 Amazon S3 数据对象。此示例显示了 Ion 格式的对象名称。
s3://amzn-s3-demo-bucket/journalExport/2019/04/15/22/JdxjkR9bSYB5jMHWcI464T.1-5.ion
数据对象内容
每个数据对象都包含以下格式的日记账区块对象。
{
blockAddress: {
strandId: String,
sequenceNo: Int
},
transactionId: String,
blockTimestamp: Datetime,
blockHash: SHA256,
entriesHash: SHA256,
previousBlockHash: SHA256,
entriesHashList: [ SHA256 ],
transactionInfo: {
statements: [
{
//PartiQL statement object
}
],
documents: {
//document-table-statement mapping object
}
},
revisions: [
{
//document revision object
}
]
}
区块是在事务过程中提交到日记账的对象。区块包含事务元数据、以及代表事务中提交的文档修订版本条目、和提交这些修订的 PartiQL 语句。
以下是一个带有 Ion 文本格式样本数据的模块示例。有关块对象字段的更多信息,请参阅Amazon 中的期刊内容 QLDB。
注意
数据块示例仅用于参考。显示的哈希值并非实际计算的哈希值。
{
blockAddress:{
strandId:"JdxjkR9bSYB5jMHWcI464T",
sequenceNo:1234
},
transactionId:"D35qctdJRU1L1N2VhxbwSn",
blockTimestamp:2019-10-25T17:20:21.009Z,
blockHash:{{WYLOfZClk0lYWT3lUsSr0ONXh+Pw8MxxB+9zvTgSvlQ=}},
entriesHash:{{xN9X96atkMvhvF3nEy6jMSVQzKjHJfz1H3bsNeg8GMA=}},
previousBlockHash:{{IAfZ0h22ZjvcuHPSBCDy/6XNQTsqEmeY3GW0gBae8mg=}},
entriesHashList:[
{{F7rQIKCNn0vXVWPexilGfJn5+MCrtsSQqqVdlQxXpS4=}},
{{C+L8gRhkzVcxt3qRJpw8w6hVEqA5A6ImGne+E7iHizo=}}
],
transactionInfo:{
statements:[
{
statement:"CREATE TABLE VehicleRegistration",
startTime:2019-10-25T17:20:20.496Z,
statementDigest:{{3jeSdejOgp6spJ8huZxDRUtp2fRXRqpOMtG43V0nXg8=}}
},
{
statement:"CREATE INDEX ON VehicleRegistration (VIN)",
startTime:2019-10-25T17:20:20.549Z,
statementDigest:{{099D+5ZWDgA7r+aWeNUrWhc8ebBTXjgscq+mZ2dVibI=}}
},
{
statement:"CREATE INDEX ON VehicleRegistration (LicensePlateNumber)",
startTime:2019-10-25T17:20:20.560Z,
statementDigest:{{B73tVJzVyVXicnH4n96NzU2L2JFY8e9Tjg895suWMew=}}
},
{
statement:"INSERT INTO VehicleRegistration ?",
startTime:2019-10-25T17:20:20.595Z,
statementDigest:{{ggpon5qCXLo95K578YVhAD8ix0A0M5CcBx/W40Ey/Tk=}}
}
],
documents:{
'8F0TPCmdNQ6JTRpiLj2TmW':{
tableName:"VehicleRegistration",
tableId:"BPxNiDQXCIB5l5F68KZoOz",
statements:[3]
}
}
},
revisions:[
{
hash:{{FR1IWcWew0yw1TnRklo2YMF/qtwb7ohsu5FD8A4DSVg=}}
},
{
blockAddress:{
strandId:"JdxjkR9bSYB5jMHWcI464T",
sequenceNo:1234
},
hash:{{t8Hj6/VC4SBitxnvBqJbOmrGytF2XAA/1c0AoSq2NQY=}},
data:{
VIN:"1N4AL11D75C109151",
LicensePlateNumber:"LEWISR261LL",
State:"WA",
City:"Seattle",
PendingPenaltyTicketAmount:90.25,
ValidFromDate:2017-08-21,
ValidToDate:2020-05-11,
Owners:{
PrimaryOwner:{
PersonId:"GddsXfIYfDlKCEprOLOwYt"
},
SecondaryOwners:[]
}
},
metadata:{
id:"8F0TPCmdNQ6JTRpiLj2TmW",
version:0,
txTime:2019-10-25T17:20:20.618Z,
txId:"D35qctdJRU1L1N2VhxbwSn"
}
}
]
}
在revisions
字段中,某些修订版本对象可能只包含一个 hash
值而不包含其他属性。这是仅供内部使用的系统修订版,不包含用户数据。导出作业将这些修订包含在各自的区块中,因为这些修订的哈希值是日记完整哈希链的一部分。加密验证需要完整的哈希链。
向下转换为 JSON
如果您指定JSON导出任务的输出格式,则在导出的数据对象JSON中QLDB将 Amazon Ion 日志数据向下转换为。但是,在某些情况下,如果您的数据使用JSON的是中不存在的丰富离子类型,则将 Ion 转换为会有损失。JSON
有关 Ion 到JSON转换规则的详细信息,请参阅 A mazon Ion Cookbook JSON 中的向下转换为
导出处理器库(Java)
QLDB为 Java 提供了一个可扩展的框架,可简化 Amazon S3 中导出的处理。该框架库处理读取导出的输出并按顺序遍历导出的区块的工作。要使用此导出处理器,请参阅 GitHub 存储库 awslabs/-java amazon-qldb-export-processor