在 Apache Beam 2.2.0 中删除 Bigtable 行
Delete Bigtable row in Apache Beam 2.2.0
在 Dataflow 1.x
版本中,我们可以使用 CloudBigtableIO.writeToTable(TABLE_ID)
来创建、更新和删除 Bigtable 行。只要DoFn
配置为输出Mutation
对象,它就可以输出Put
或Delete
,并且CloudBigtableIO.writeToTable()
成功创建、更新、或删除给定 RowID 的行。
似乎新的Beam 2.2.0 API
使用了BigtableIO.write()
函数,它与KV<RowID, Iterable<Mutation>>
一起工作,其中Iterable
包含一组行级操作。我已经找到了如何使用它来处理单元格级数据,因此可以创建新行和 create/delete 列,但是我们现在如何删除行,给定现有的 RowID?
感谢任何帮助!
** 一些进一步的说明:
来自此文档:https://cloud.google.com/bigtable/docs/dataflow-hbase 我了解到将依赖项 ArtifactID 从 bigtable-hbase-dataflow
更改为 bigtable-hbase-beam
应该与 Beam 版本 2.2.0 兼容,文章建议执行 Bigtble 写入(并因此使用 CloudBigtableIO.writeToTable()
以旧方式删除)。然而,这需要从 com.google.cloud.bigtable.dataflow
系列的依赖项中导入,发行说明建议不推荐使用并且不应使用(实际上它似乎与新配置 classes/etc 不兼容)
** 进一步更新:
从 bigtable-hbase-dataflow
更改为 bigtable-hbase-beam
ArtifactID 后,我的 pom.xml
似乎没有正确刷新。项目更新后,我就可以从
com.google.cloud.bigtable.beam.*
分支,它似乎至少在最小测试中起作用。
然而:看起来现在有两个不同的突变 类:
com.google.bigtable.v2.Mutation
和
org.apache.hadoop.hbase.client.Mutation
?
为了让所有东西一起工作,必须正确指定哪个突变用于哪个操作?
有更好的方法吗?
我建议您继续使用 CloudBigtableIO
和 bigtable-hbase-beam
。它应该与 bigtable-hbase-dataflow
.
中的 CloudBigtableIO
差别不大
CloudBigtableIO
使用 HBase org.apache.hadoop.hbase.client.Mutation
并在幕后将它们转换为 Bigtable 等效值
遗憾的是,Apache Beam 2.2.0 没有提供用于删除 Bigtable 中的整行(包括行键)的本机接口。唯一完整的解决方案是继续使用您已经提到的 CloudBigtableIO
class。
另一种解决方案是只删除行中的所有单元格。这样,您就可以完全使用 BigtableIO
class。但是,此解决方案不会删除行键本身,因此存储行键的成本仍然存在。如果您的应用程序需要删除很多行,此解决方案可能并不理想。
import com.google.bigtable.v2.Mutation
import com.google.bigtable.v2.Mutation.DeleteFromRow
// mutation to delete all cells from a row
Mutation.newBuilder().setDeleteFromRow(DeleteFromRow.getDefaultInstance()).build()
在 Dataflow 1.x
版本中,我们可以使用 CloudBigtableIO.writeToTable(TABLE_ID)
来创建、更新和删除 Bigtable 行。只要DoFn
配置为输出Mutation
对象,它就可以输出Put
或Delete
,并且CloudBigtableIO.writeToTable()
成功创建、更新、或删除给定 RowID 的行。
似乎新的Beam 2.2.0 API
使用了BigtableIO.write()
函数,它与KV<RowID, Iterable<Mutation>>
一起工作,其中Iterable
包含一组行级操作。我已经找到了如何使用它来处理单元格级数据,因此可以创建新行和 create/delete 列,但是我们现在如何删除行,给定现有的 RowID?
感谢任何帮助!
** 一些进一步的说明:
来自此文档:https://cloud.google.com/bigtable/docs/dataflow-hbase 我了解到将依赖项 ArtifactID 从 bigtable-hbase-dataflow
更改为 bigtable-hbase-beam
应该与 Beam 版本 2.2.0 兼容,文章建议执行 Bigtble 写入(并因此使用 CloudBigtableIO.writeToTable()
以旧方式删除)。然而,这需要从 com.google.cloud.bigtable.dataflow
系列的依赖项中导入,发行说明建议不推荐使用并且不应使用(实际上它似乎与新配置 classes/etc 不兼容)
** 进一步更新:
从 bigtable-hbase-dataflow
更改为 bigtable-hbase-beam
ArtifactID 后,我的 pom.xml
似乎没有正确刷新。项目更新后,我就可以从
com.google.cloud.bigtable.beam.*
分支,它似乎至少在最小测试中起作用。
然而:看起来现在有两个不同的突变 类:
com.google.bigtable.v2.Mutation
和
org.apache.hadoop.hbase.client.Mutation
?
为了让所有东西一起工作,必须正确指定哪个突变用于哪个操作?
有更好的方法吗?
我建议您继续使用 CloudBigtableIO
和 bigtable-hbase-beam
。它应该与 bigtable-hbase-dataflow
.
CloudBigtableIO
差别不大
CloudBigtableIO
使用 HBase org.apache.hadoop.hbase.client.Mutation
并在幕后将它们转换为 Bigtable 等效值
遗憾的是,Apache Beam 2.2.0 没有提供用于删除 Bigtable 中的整行(包括行键)的本机接口。唯一完整的解决方案是继续使用您已经提到的 CloudBigtableIO
class。
另一种解决方案是只删除行中的所有单元格。这样,您就可以完全使用 BigtableIO
class。但是,此解决方案不会删除行键本身,因此存储行键的成本仍然存在。如果您的应用程序需要删除很多行,此解决方案可能并不理想。
import com.google.bigtable.v2.Mutation
import com.google.bigtable.v2.Mutation.DeleteFromRow
// mutation to delete all cells from a row
Mutation.newBuilder().setDeleteFromRow(DeleteFromRow.getDefaultInstance()).build()