我们可以预测 Hive SELECT * 查询结果的顺序吗?
Can we predict the order of the results of a Hive SELECT * query?
如果使用与 Metastore 相同的 DBMS,SELECT * query (no ORDER BY)
的结果顺序是否可能始终相同?
因此,只要将 MySQL 用作 Metastore,SELECT *;
查询的结果顺序将始终相同。如果使用 Postgres,相同数据的顺序将始终相同,但与使用 MySQL 时不同。我说的是相同的数据。
也许这一切都归结为结果的默认顺序是什么以及为什么 MySQL 和 Postgres Metastore 不同的问题。
没有默认的行顺序,如果没有 ORDER BY
,则无法保证顺序。这个事实与使用的 Metastore 数据库无关。
一般情况下,许多进程(映射器)并行读取数据,计算拆分后,每个进程开始读取一些文件或几个文件,具体取决于计算的拆分。所有并行进程都可以在不同的节点上处理不同的数据量和运行,每次的负载都不一样,所以它们在不同的时间开始return行和完成,取决于太多的因素,例如节点负载、网络负载、每个进程的数据量等。删除所有这些因素可以提高订单预测的准确性。比如说,单线程顺序文件读取将 return 行的顺序与它们在文件中的顺序相同。但这不是数据库的工作方式。
同样根据 Codd 的关系理论,列和行的顺序对数据库来说并不重要。
如果使用与 Metastore 相同的 DBMS,SELECT * query (no ORDER BY)
的结果顺序是否可能始终相同?
因此,只要将 MySQL 用作 Metastore,SELECT *;
查询的结果顺序将始终相同。如果使用 Postgres,相同数据的顺序将始终相同,但与使用 MySQL 时不同。我说的是相同的数据。
也许这一切都归结为结果的默认顺序是什么以及为什么 MySQL 和 Postgres Metastore 不同的问题。
没有默认的行顺序,如果没有 ORDER BY
,则无法保证顺序。这个事实与使用的 Metastore 数据库无关。
一般情况下,许多进程(映射器)并行读取数据,计算拆分后,每个进程开始读取一些文件或几个文件,具体取决于计算的拆分。所有并行进程都可以在不同的节点上处理不同的数据量和运行,每次的负载都不一样,所以它们在不同的时间开始return行和完成,取决于太多的因素,例如节点负载、网络负载、每个进程的数据量等。删除所有这些因素可以提高订单预测的准确性。比如说,单线程顺序文件读取将 return 行的顺序与它们在文件中的顺序相同。但这不是数据库的工作方式。
同样根据 Codd 的关系理论,列和行的顺序对数据库来说并不重要。