Google bigquery 通过数据流导入Bigtable BigQuery:关于表分区和时间戳的2个问题

Google bigquery 通过数据流导入Bigtable BigQuery:关于表分区和时间戳的2个问题,google-bigquery,google-cloud-dataflow,google-cloud-bigtable,Google Bigquery,Google Cloud Dataflow,Google Cloud Bigtable,我在数据流方面有一项工作,通过使用内置的数据流API将数据从Bigtable导入Bigquery。我有两个问题: 问题1:如果源数据位于Bigtable中的一个大表中,我如何在BigQuery中基于(例如)仅在运行时已知的给定Bigtable行键动态地将其划分为一组子表或更小的表 数据流中的Java代码如下所示: p.apply(Read.from(CloudBigtableIO.Read(config))) .apply(ParDo.of(new SomeDoFNonBTSourceData(

我在数据流方面有一项工作,通过使用内置的数据流API将数据从Bigtable导入Bigquery。我有两个问题:

问题1:如果源数据位于Bigtable中的一个大表中,我如何在BigQuery中基于(例如)仅在运行时已知的给定Bigtable行键动态地将其划分为一组子表或更小的表

数据流中的Java代码如下所示:

p.apply(Read.from(CloudBigtableIO.Read(config)))
.apply(ParDo.of(new SomeDoFNonBTSourceData())
.apply(BigQueryIO.Write
.to(项目ID+“:“+BQ\U数据集+”+BQ\U表格名)
.withSchema(schema)
.withWriteDisposition(BigQueryIO.Write.WriteDisposition.Write\u TRUNCATE)
.withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE如果需要);
p、 run();
因此,既然必须在代码级别提供
BQ_TableName
,我如何根据
SomeDoFNonBTSourceData
中看到的内容(如当前行键的值范围)以编程方式提供它?如果RowKey为“a-c”,则为表a;如果为“d-f”,则为表b,以此类推

问题2:什么是将Bigtable时间戳导出到Bigquery的正确方法,以便最终在Bigquery中以人类可读的格式重建它

DoFn中的processElement函数如下所示:

public void processElement(ProcessContext c)
{
String valA=新字符串(c.element().getColumnLatestCell(COL_FAM,COL_NAME).getValueArray());
Long timeStamp=c.element().getColumnLatestCell(COL_FAM,COL_NAME).getTimestamp();
tr.put(“可乐”,瓦拉);
tr.put(“时间戳”,时间戳);
c、 输出(tr);
}
在管道构建过程中,timeStamp列的BQ模式设置如下所示:

List fields=new ArrayList();
add(newtablefieldschema().setName(“ColA”).setType(“STRING”));
add(newtablefieldschema().setName(“TimeStamp”).setType(“TimeStamp”));
schema=new TableSchema().setFields(字段);

因此,Bigtable时间戳的类型似乎是
Long
,我尝试了BQ中目标时间戳列的
“timestamp”
“INTEGER”
类型(似乎BQ中没有Long)。最后,我需要在BQ中使用TimeStamp列来表示“orderby”子句,并以人类可读的形式显示信息(日期和时间)。“按顺序”部分似乎工作正常,但我还没有设法将最终结果转换成任何有意义的内容——要么是转换错误,要么是仍然无法阅读的内容。

顺便说一句,我在这里寻找类似于问题1:)的问题的答案

对于第二个问题,我认为您首先需要确认长时间戳确实是UNIX时间戳,我一直假设BQ可以将其作为时间戳而不进行任何转换

但是你可以试试这个

Long longTimeStamp = 1408452095L;

Date timeStamp = new Date();
timeStamp.setTime(longTimeStamp * 1000);

tr.put("TimeStamp", timeStamp.toInstant().toString());

对不起,那是什么类型的日期?java.util.Date似乎没有“.toInstant()”,而Google API中的Date也没有其他一些方法?能否尝试将语言级别更改为“8-lambdas,type annotation等”。在Intellij go to project structure中,选择您的模块并更改语言级别。我不知道如何在Eclipse中实现这一点。啊,你是对的——我在文档中看到了它。一定是我的日食。我会解决的。如果我在问题1中发现了什么,我会在这里发布。。。