BigQuery 与 BigTable 连接,无法执行任何查询

Posted

技术标签:

【中文标题】BigQuery 与 BigTable 连接,无法执行任何查询【英文标题】:BigQuery with BigTable connection, cannot execute any query 【发布时间】:2020-01-31 08:54:57 【问题描述】:

我想根据 BigTable 中的数据生成一些报告。为此,我想创建一个查询,该查询将从 BigTable 获取最新数据并将其传递到数据工作室报告中。现在的问题是,当我在 BigQuery 中创建 BigTable 连接时,我无法执行任何查询,即使在空表上也是如此。 我通过以下方式为 BigQuery 创建类型:

bq mk \
--external_table_definition=gs://somebucket/big-table-definition.json \
datareportingdataset.datareportingtable

命令执行成功。 我的big-table-definition.json 如下所示:


    "sourceFormat": "BIGTABLE",
    "sourceUris": [
        "https://googleapis.com/bigtable/projects/playground-2/instances/data-reporting/tables/data-reporting-table"
    ],
    "bigtableOptions": 
        "readRowkeyAsString": "true",
        "columnFamilies" : [
            
                "familyId": "cf1",
                "onlyReadLatest": "true",
                "columns": [
                    
                        "qualifierString": "temp",
                        "type": "STRING"
                    ,
                    
                    //the rest of the columns
                ]
            
        ]
    

执行简单的select * 查询时的错误如下所示:

Error while reading table: datareportingdataset.datareportingtable, error message: Error detected while parsing row starting at position: 2. Error: Data between close double quote (") and field separator.

首先我怀疑 BigTable 中有一些数据,但是当我从那里删除所有内容时,错误仍然存​​在。我发现它必须与 json 文件本身有关,因为当我将“sourceFormats”向下移动几行时,报告的错误更改位置。 我在这里做错了什么?

【问题讨论】:

【参考方案1】:

刚刚复制了您的案例并发现了完全相同的错误。在我看来,当您运行 bq mk 命令时,它根本没有提取任何数据。

作为工作人员,我建议您运行 Dataflow job 以将数据作为 .avro 文件提取到 Cloud Storage,然后将数据导入 Bigquery 中的数据集。

【讨论】:

我不相信 Bigtable avro 文件能够导入到 BigQuery(即使它接受 avro 文件)【参考方案2】:

我想我发现了问题,因为我能够重现它。错误消息令人困惑,但正如 here 所记录的那样:

您必须手动创建 JSON 架构文件,并且它必须在您的 本地机器。引用存储在 Cloud Storage 中的 JSON 架构文件 或不支持在 Google Drive 中。

我用Bigtable quickstart 做了一些测试,对我来说效果很好:

bq query "SELECT * FROM DATASET.datareportingtable"
Waiting on JOB_ID ... (3s) Current status: DONE   
+--------+-----------------+---------------------------+-----------------------+
| rowkey | cf1_column_name | cf1_column_cell_timestamp | cf1_column_cell_value |
+--------+-----------------+---------------------------+-----------------------+
| r1     | c1              |       2019-10-15 18:15:04 | test-value            |
+--------+-----------------+---------------------------+-----------------------+

我唯一不同的是使用本地路径,如下所示:

--external_table_definition=big-table-definition.json

改回:

--external_table_definition=gs://$BUCKET/big-table-definition.json

我得到了同样的错误:

bq query "SELECT * FROM DATASET.datareportingtable2"
Waiting on JOB_ID ... (0s) Current status: DONE   
BigQuery error in query operation: Error processing job 'PROJECT:JOB_ID': Error while reading table: DATASET.datareportingtable2, error message: Error detected while parsing row starting at
position: 2. Error: Data between close double quote (") and field separator.

【讨论】:

有趣,我现在没有时间检查,但感谢您的努力

以上是关于BigQuery 与 BigTable 连接,无法执行任何查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BigQuery 标准 SQL 中查询 Bigtable 列值?

是否可以针对本地 BigTable 模拟器实例运行 BigQuery 命令行界面 (cli)?

在 python 中使用谷歌数据流从 Bigquery 到 Bigtable 数据传输

将原始 Google Analytics 数据从 BigQuery 移动到 Amazon S3

将 BigTable 与 Apache Hue 连接起来

通过联接合并到 BigQuery 分区表中,无需扫描整个表