

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# QLDB 中的日记账导出输出
<a name="export-journal.output"></a>

**重要**  
终止支持通知：现有客户将能够使用 Amazon QLDB，直到 2025 年 7 月 31 日终止支持。有关更多详细信息，请参阅[将亚马逊 QLDB 账本迁移到亚马逊 Aurora PostgreSQL](https://aws.amazon.com/blogs/database/migrate-an-amazon-qldb-ledger-to-amazon-aurora-postgresql/)。

除包含您的日记账区块的数据对象外，Amazon QLDB 日记账导出作业还会写入两个清单文件。这些文件都保存在[导出请求](export-journal.request.md)指定的 Amazon S3 存储桶中。以下章节介绍每个输出对象的格式和内容。

**注意**  
如果您将 JSON 指定为导出作业的输出格式，QLDB 会将 Amazon Ion 日记账数据在导出的数据对象中将其转换为 JSON 格式。有关更多信息，请转至 [向下转换至 JSON](#export-journal.output.json)。

**Topics**
+ [

## 清单文件
](#export-journal.output.manifest)
+ [

## 数据对象
](#export-journal.output.data)
+ [

## 向下转换至 JSON
](#export-journal.output.json)
+ [

## 导出处理器库（Java）
](#export-journal.output.processor)

## 清单文件
<a name="export-journal.output.manifest"></a>

Amazon QLDB 为每个导出请求在提供的 S3 存储桶中创建两个清单文件。*初始清单*文件将在您提交导出请求后立即创建。*最终清单*文件是在导出完成后写入的。您可以使用这些文件来检查 Amazon S3 中导出作业的状态。

清单文件内容的格式与请求的导出输出格式相对应。

### 初始清单
<a name="export-journal.output.manifest.initial"></a>

初始清单表明您的导出作业已启动。它包含您传递给请求的输入参数。除了 Amazon S3 目标以及导出的开始和结束时间参数外，此文件还包含一个 `exportId`。此 `exportId` 是 QLDB 分配给每个导出作业的唯一 ID。

文件命名约定如下。

```
s3://amzn-s3-demo-qldb-cloudtrail/prefix/exportId.started.manifest
```

下面是 Ion 文本格式的初始清单文件及其内容示例。

```
s3://amzn-s3-demo-qldb-cloudtrail/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-qldb-cloudtrail",
  prefix:"journalExport",
  objectEncryptionType:"NO_ENCRYPTION",
  outputFormat:"ION_TEXT"
}
```

`outputFormat`只有在导出请求中指定时，初始清单才会包含该清单。如果您没有指定输出格式，导出的数据将默认为 `ION_TEXT`。

[DescribeJournalS3Export API 操作和导出](https://docs.aws.amazon.com/qldb/latest/developerguide/API_DescribeJournalS3Export.html)的 Amazon S3 对象的内容类型也表明了输出格式。

### 最终清单
<a name="export-journal.output.manifest.final"></a>

最终清单表示特定日记账*链*的导出作业已完成。导出作业为每个分支写入一个单独的最终清单文件。

**注意**  
在 Amazon QLDB 中，分支是分类账日记账的分区。QLDB 目前仅支持单链日记账。

最终清单包括导出期间写入的数据对象密钥的有序列表。文件命名约定如下。

```
s3://amzn-s3-demo-qldb-cloudtrail/prefix/exportId.strandId.completed.manifest
```

`strandId` 是 QLDB 分配给链的唯一 ID。下面是 Ion 文本格式的最终清单文件及其内容示例。

```
s3://amzn-s3-demo-qldb-cloudtrail/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"
  ]
}
```

## 数据对象
<a name="export-journal.output.data"></a>

Amazon QLDB 会以 Amazon Ion 格式的文本或二进制表示，或 *JSON Lines* 文本格式，将日记账数据对象写入提供的 Amazon S3 存储桶中。

在 JSON 行格式中，导出的数据对象中的每个区块都是由换行符分隔的有效 JSON 对象。您可以使用这种格式将 JSON 导出与 Amazon Athena 等分析工具直接集成，因为这些服务可以自动解析以换行 AWS Glue 符分隔的 JSON。有关数据格式的更多信息，请参阅 [JSON 行](https://jsonlines.org/)。

### 数据对象名称
<a name="export-journal.output.data.filename"></a>

日记账导出作业使用以下命名约定写入这些数据对象。

```
s3://amzn-s3-demo-qldb-cloudtrail/prefix/yyyy/mm/dd/hh/strandId.startSn-endSn.ion|.json
```
+ 每个导出作业的输出数据都被分成多个块。
+ `yyyy/mm/dd/hh`— 您提交导出请求的日期和时间。在同一小时内导出的对象是按相同的 Amazon S3 前缀进行分组。
+ `strandId`— 包含要导出的日记账区块的特定链的唯一 ID。
+ `startSn-endSn`— 对象中包含的序列号范围。序列号指定区块在链中的位置。

例如，假设您指定以下路径。

```
s3://amzn-s3-demo-qldb-cloudtrail/journalExport/
```

您的导出作业会创建一个类似于以下的 Amazon S3 数据对象。此示例显示了 Ion 格式的对象名称。

```
s3://amzn-s3-demo-qldb-cloudtrail/journalExport/2019/04/15/22/JdxjkR9bSYB5jMHWcI464T.1-5.ion
```

### 数据对象内容
<a name="export-journal.output.data.contents"></a>

每个数据对象都包含以下格式的日记账区块对象。

```
{
  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](ql-reference.md) 语句。

以下是一个带有 Ion 文本格式样本数据的模块示例。有关块对象字段的更多信息，请参阅[Amazon QLDB 中的日记账内容](journal-contents.md)。

**注意**  
数据块示例仅用于参考。显示的哈希值并非实际计算的哈希值。

```
{
  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
<a name="export-journal.output.json"></a>

如果您将 JSON 指定为导出作业的输出格式，QLDB 会将 Amazon Ion 日记账数据在导出的数据对象中将其转换为 JSON 格式。但是，在某些情况下，如果您的数据使用 JSON 中不存在的丰富 Ion 类型，则将 Ion 转换为 JSON 时会有损失。

有关 Ion 与 JSON 转换规则的详细信息，请参阅*Amazon Ion Cookbook*中的[向下转换至 JSON](https://amzn.github.io/ion-docs/guides/cookbook.html#down-converting-to-json)。

## 导出处理器库（Java）
<a name="export-journal.output.processor"></a>

QLDB 为 Java 提供了一个可扩展的框架，该框架可以简化 Amazon S3 中的导出处理。该框架库处理读取导出的输出并按顺序遍历导出的区块的工作。要使用此导出处理器，请参阅 GitHub 存储库 [awslabs/-java amazon-qldb-export-processor](https://github.com/awslabs/amazon-qldb-export-processor-java)。