Google bigquery Google云数据流随机化WritetoBigQuery

Google bigquery Google云数据流随机化WritetoBigQuery,google-bigquery,google-cloud-platform,google-cloud-dataflow,Google Bigquery,Google Cloud Platform,Google Cloud Dataflow,我已经成功地实现了一个写入BigQuery的数据流管道。此管道正在为云ML引擎作业转换数据。但是,我注意到已写入的行是按数据标签排序(或至少分组)的。我的意思是,它们在视觉上似乎是以某种方式组织起来的(这不是完全随机的)。然后,当我将表格导出到GCS中的sharded.csv时,每个sharded.csv基本上是有序的。这意味着数据不能随机输入TensorFlow,因为TF一次捕获一个.csv,而.csv本身不是随机的包或行 有谁能解释一下,如果原始输入数据是随机的,那么ApacheBeam管道

我已经成功地实现了一个写入BigQuery的数据流管道。此管道正在为云ML引擎作业转换数据。但是,我注意到已写入的行是按数据标签排序(或至少分组)的。我的意思是,它们在视觉上似乎是以某种方式组织起来的(这不是完全随机的)。然后,当我将表格导出到GCS中的sharded.csv时,每个sharded.csv基本上是有序的。这意味着数据不能随机输入TensorFlow,因为TF一次捕获一个.csv,而.csv本身不是随机的包或行


有谁能解释一下,如果原始输入数据是随机的,那么ApacheBeam管道编写的BigQuery表为什么看起来是非随机的?在写入BigQuery之前,有没有办法强制执行行的无序/随机化?在加载到ML模型之前,我需要确保训练数据是完全随机的。

BigQuery表没有顺序或分组的概念,它们只是一袋行;如果需要排序或分组,则使用ORDERBY或GROUPBY子句编写查询。如果您有从BigQuery中读取行的代码,并且要求以随机顺序读取这些行,那么您可以执行类似于

的操作,我更新了我的问题,以尝试更具体一些。当我查看BigQuery表的前50行时,我可以直观地看到,这些行不再是随机的。因此,当我将这些数据导出到GCS时,sharded.csv也不再是随机的,这会在我的输入数据中产生问题。您提到的重复子采样对我没有帮助,因为我需要首先将sharded.csv导出到GCS,而不是直接查询表。您能帮助我理解为什么数据流管道创建的BigQuery行如果只是一袋行,那么它会显示为非随机的吗?“袋行”意味着BigQuery表中的行顺序是1)未指定和2)不确定的,即BigQuery允许以任何顺序返回行,并且每次请求时都以不同的顺序返回行。它确实保证了订单在任何意义上都是“随机的”。如果您需要随机性,您需要自己介绍它,例如通过按散列排序(某物)。当您查询时,行显示为非随机的原因可能有很多。事实上,它们可能以某种方式物理地存储在BigQuery的存储引擎中,由于BigQuery存储和查询引擎的内部实现细节,可能还有数据流,因此部分地与输入数据中的一些顺序一致;也许作为存储层的优化,BigQuery选择了以某种方式对数据进行预排序,或者将其插入排序后的索引(我不知道BQ是否会这样做,但许多其他数据库肯定会这样做);BigQuery表没有order(此外,BQ甚至不允许对大型查询结果按order排序);您对数据流或BigQuery导出所做的任何操作都无法改变这一点。除了包含所有行之外,无法保证bigquery导出的输出顺序。听起来您真正想要的是获取BigQuery生成的CSV文件集,并生成一个有序的CSV文件序列,其中包含相同的数据,但看起来更随机,对吗?数据有多大?您的主要观点是:试试BigQueryIO.read()+Reshuffle.viaRandomKey()+TextIO.write()?从技术上讲,这也不会给您任何“随机外观”的硬保证,但实际上很可能至少会在不同生成的文件之间随机分布数据。