Google Cloud DataFlow 随机化 WritetoBigQuery
Posted
技术标签:
【中文标题】Google Cloud DataFlow 随机化 WritetoBigQuery【英文标题】:Google Cloud DataFlow Randomize WritetoBigQuery 【发布时间】:2017-10-16 20:46:34 【问题描述】:我已成功实现写入 BigQuery 的数据流管道。此管道正在转换 Cloud ML Engine 作业的数据。但是,我注意到已写入的行按我的数据标签排序(或至少分组)。我的意思是,它们在视觉上似乎以某种方式组织起来(这不是完全随机的)。然后,当我将表导出到 GCS 中的分片 .csv 时,每个分片 .csv 基本上都是有序的。这意味着数据不能随机输入 TensorFlow,因为 TF 一次抓取一个 .csv,而 .csv 本身不是随机包或行。
如果原始输入数据是随机的,任何人都可以解释为什么 apache Beam 管道写入的 BigQuery 表看起来是非随机的吗?有没有办法在写入 BigQuery 之前强制对行进行洗牌/随机化?在加载到 ML 模型之前,我需要确保训练数据是完全随机的。
【问题讨论】:
【参考方案1】:BigQuery 表没有顺序或分组的概念,它们只是一组行;如果需要排序或分组,则使用 ORDER BY 或 GROUP BY 子句编写查询。如果您有从 BigQuery 读取行并要求以随机顺序读取这些行的代码,您可以执行 https://www.oreilly.com/learning/repeatable-sampling-of-data-sets-in-bigquery-for-machine-learning
之类的操作【讨论】:
我更新了我的问题以尝试更具体。当我查看 BigQuery 表的前 50 行时,我可以直观地看到这些行不再是随机的。因此,当我将此数据导出到 GCS 时,分片 .csv 也不再是随机的,这会在我的输入数据中产生问题。您提到的重复子采样对我没有帮助,因为我需要先将分片的 .csv 导出到 GCS,而不是直接查询表。您能否帮助我理解为什么由数据流管道创建的 BigQuery 行如果只是一袋行会显得非随机? "Bag of rows" 表示 BigQuery 表中的行顺序是 1) 未指定和 2) 不确定 - 即 BigQuery 允许以任何顺序返回行,并且每个行以不同的顺序返回你问的时候。它确实保证了订单在任何意义上都是“随机的”。如果您需要随机性,您需要自己介绍它,例如通过做 ORDER BY HASH(something). 查询时行出现非随机的原因可能有很多。也许它们在物理上确实以某种方式存储在 BigQuery 的存储引擎中,由于 BigQuery 存储和查询引擎以及可能的 Dataflow 的内部实现细节,部分与输入数据中的一些排序一致;可能 BigQuery 作为存储层的优化,选择以某种方式对数据进行预排序或者将其插入到排序索引中(我不知道 BQ 是否会这样做,但许多其他数据库肯定会这样做);可能是别的东西。 BigQuery 表没有顺序(而且 BQ 甚至不允许对大型查询结果进行 ORDER BY cloud.google.com/bigquery/docs/writing-results#large-results);您对 Dataflow 或 BigQuery 导出所做的任何事情都无法改变这一点。没有办法保证关于 bigquery 导出的输出顺序的任何事情,除了它将包含所有行。听起来您真正想要的是获取 BigQuery 生成的 CSV 文件集并生成包含相同数据但看起来更随机的有序 CSV 文件序列,对吗?数据有多大? 到你的主要观点:试试 BigQueryIO.read() + Reshuffle.viaRandomKey() + TextIO.write()?这在技术上也不会给您任何“随机外观”的硬性保证,但实际上很可能至少会在不同生成的文件之间随机分布数据。以上是关于Google Cloud DataFlow 随机化 WritetoBigQuery的主要内容,如果未能解决你的问题,请参考以下文章
在 google-cloud-dataflow 中使用文件模式匹配时如何获取文件名
到 Cloud Bigtable 的 Google Cloud Dataflow 管道中的异常
Google-cloud-dataflow:无法通过带有“BigQueryDisposition.WRITE_TRUNCATE”的“WriteToBigQuery/BigQuerySink”将 jso
Google Cloud Dataflow 服务帐户未传播给工作人员?