Google bigquery 错误:消息:提供的源太多:15285。限额是10000

Google bigquery 错误:消息:提供的源太多:15285。限额是10000,google-bigquery,google-cloud-dataflow,apache-beam,Google Bigquery,Google Cloud Dataflow,Apache Beam,我目前正试图运行一个Dataflow(apachebeam,pythonsdk)任务,将一个>100GB的Tweet文件导入BigQuery,但遇到了Error:Message:提供的源太多:15285。上限为10000。 该任务获取tweets(JSON),提取5个相关字段,通过一些转换对它们进行转换/净化,然后将这些值写入BigQuery,用于进一步处理 有很多不同的输入文件,而我只有一个输入文件,所以它似乎不相关。此外,这里提到的解决方案相当神秘,我不确定是否/如何将它们应用于我的问题 我

我目前正试图运行一个Dataflow(apachebeam,pythonsdk)任务,将一个>100GB的Tweet文件导入BigQuery,但遇到了
Error:Message:提供的源太多:15285。上限为10000。

该任务获取tweets(JSON),提取5个相关字段,通过一些转换对它们进行转换/净化,然后将这些值写入BigQuery,用于进一步处理

有很多不同的输入文件,而我只有一个输入文件,所以它似乎不相关。此外,这里提到的解决方案相当神秘,我不确定是否/如何将它们应用于我的问题

我的猜测是,BigQuery在持久化它们之前为每一行或某些东西编写临时文件,这就是所谓的“太多源”的意思

我怎样才能解决这个问题

[编辑]

代码:


这有点复杂,所以直接在bigquery中执行可能需要太多时间。代码读取tweets json,根据是否带有地理标记来拆分PCollection,如果没有,则尝试通过profile location进行查找,将位置映射到与我们的GIS分析相关的位置,然后将其写入BigQuery。

文件数对应于元素处理的碎片数

减少这种情况的一个技巧是生成一些随机键,并在写出元素之前根据这些键对元素进行分组

例如,您可以在管道中使用以下
DoFn
PTransform

class _RoundRobinKeyFn(beam.DoFn):
  def __init__(self, count):
    self.count = count

  def start_bundle(self):
    self.counter = random.randint(0, self.count - 1)

  def process(self, element):
    self.counter += 1
    if self.counter >= self.count:
      self.counter -= self.count
    yield self.counter, element

class LimitBundles(beam.PTransform):
  def __init__(self, count):
    self.count = count

  def expand(self, input):
    return input
        | beam.ParDo(_RoundRobinKeyFn(self.count))
        | beam.GroupByKey()
        | beam.FlatMap(lambda kv: kv[1])
您只需在bigquery_输出之前使用它:

output = (# ...
         | LimitBundles(10000)
         | bigquery_output)

(请注意,我只是在没有测试的情况下输入了这个,所以可能有一些Python打字错误。)

您能分享您的代码吗?另外,您是否必须使用Beam进行转换,例如,您是否可以在BigQuery中进行转换,例如,将文件加载到GCS中,将BigQuery指向该文件,然后在导入过程中进行转换(如果您愿意,也可以在之后进行转换)。我在一个编辑器中添加了代码,您使用的是哪个版本的SDK?python版本。以下是目前安装的所有google软件包:google apitools(0.5.10)google auth(1.0.0)google-auth-httplib2(0.0.2)google cloud bigquery(0.22.1)google cloud core(0.22.1)google cloud dataflow(0.6.0)googleapis common protos(1.5.2)googledatastore(7.0.0)和google cloud SDK版本154.0.0,使用v2版本的Dataflow上述解决方案工作时,会显著增加Dataflow作业的运行时间。事实上,在整个批处理按随机键分组之前,不能将行写入Bigquery。apachebeam的想法是隐藏底层技术的底层实现,并将重点放在算法和数据管道上。那么,为什么我们必须添加额外的逻辑来使用Beam的sink连接器写入Bigquery呢?即使对于只从Bigquery中读取数百万行、处理它们并写回Bigquery的ETL作业也是如此。
output = (# ...
         | LimitBundles(10000)
         | bigquery_output)