当前位置: 首页 > 知识库问答 >
问题:

Biqquery:错误-某些行属于不同的分区,而不是目标分区

楚俊逸
2023-03-14

我的表中有以下分区按“日期”分区

Row partition_id

1   20210222

2   20210223

我试图通过使用BigQuery python API覆盖这些分区20210222之一

我的tablename是table\u name$20210222,我使用WRITE\u TRUNCATE作为写入配置,但我得到以下错误:

google.api_core.exceptions.BadRequest: 400 Some rows belong to different partitions
      rather than destination partition 20210222

我希望能够通过python代码覆盖其中一个分区。它适用于WRITE\u APPENDWRITE\u TRUNCATEWRITE\u APPEND添加重复和WRITE\u TRUNCATE删除以前的表,只添加新数据。我想替换现有分区的数据。

共有2个答案

方博学
2023-03-14

您可能希望尝试直接使用MERGE语句覆盖特定分区上的数据,如下所示。

MERGE INTO `table` AS INTERNAL_DEST
USING (
 SELECT * FROM data_to_overwrite
) AS INTERNAL_SOURCE
ON FALSE

when not matched by source
    and INTERNAL_DEST.partition_id BETWEEN 20210222 AND 20210222 
          -- the range of the partitions to be overwritten
    then delete

when not matched then insert ROW

更新以获取更多注意事项和警告。

我想说这是我所知道的唯一可行的方法来更新这样的数据。将此查询包装在python代码中,并调用python代码来覆盖历史数据。

请注意,覆盖历史数据不符合BQ加载数据的最佳实践。它可以稀疏地用于批量更新数据。而且它决不能像我们在事务数据库中所做的那样用作事务性更新操作。

这被认为是一个DML操作,与其他数据加载方法相比,它的配额要低得多。有关BQ加载策略之间差异的详细信息,请参阅本文。BigQuery:此表的表dml插入操作太多

柴坚诚
2023-03-14

BigQuery转换并存储UTC时区中的所有时间戳值。因此,如果您有一个按DAY分区的表,并且您尝试在UTC以外的时区插入时间戳,那么它将首先转换为UTC,然后存储在相关分区中。

在您的例子中,您似乎有一个类似于2020-12-25 00:30:00 CET的值,它在存储时转换为UTC时是2020-12-24 23:30:00 UTC,因此它与同一天的其他值(在您的时区中)属于不同的分区。

这将导致您遇到的错误,因为您正试图覆盖特定分区,并且您正试图插入的某些项属于不同的分区。

 类似资料:
  • 我正在玩OpenTelemata,并有这样的设置: Golang,docker compose,3个服务,1个独立的开放式遥测采集器,1个Prometheus。 我将一些系统指标收集到一个独立的开放遥测收集器。这些指标是从3个不同的服务收集的,并且指标具有相同的名称。然后,Prometheus从开放遥测收集器获取数据。问题是我无法区分Prometheus中不同服务的指标,因为所有指标都具有相同的“

  • 所以,如果假设有一条这样的线: 使用标准标记器几乎没有问题。 null PS:我在ES邮件列表中看过这篇文章,但它不能与电子邮件地址或主机名一起工作,因为我不能有一个所有电子邮件地址/主机名的详尽列表。所以,我希望你能理解我的要求。

  • 我目前正在查看CPU管道中可以检测分支错误预测的各个部分。我发现这些是: 分支目标缓冲区(BPU CLEAR) 分支地址计算器(BA CLEAR) 跳转执行单元(不确定此处的信号名称??) 我知道2和3检测到什么,但我不知道BTB中检测到什么预测失误。BAC检测BTB错误地预测了非分支指令的分支,BTB未能检测到分支,或者BTB错误预测了x86 RET指令的目标地址。执行单元评估分支并确定它是否正

  • 我有一个类Human,它包含两个字段,age(int)和name(String)。在eclipse中,我用这两个字段重写hashCode()和equals()方法。我还根据年龄字段创建了一个比较器。 现在,我用年龄比较器创建了一个TreeSet对象,还创建了Human类的两个实例(具有不同的字段值)。然后我将这两个对象添加到集合中,然而,集合中总是只有一个对象。 为了理解问题,我打印了这两个对象的

  • 我尝试用构建我的Java项目,得到了以下内容: 的第25行:

  • 提示: ●输入点、面要素,计算点归属于那个区域。 ●点击 “分析”,统计完成后点击各个标注可查看判断结果。 操作步骤: ①选择"统计分析"模块。 ②点击"标注点区域归属分析"。 操作动图: [查看原图]