Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search 配置单元:反向顺序搜索_Search_Hive - Fatal编程技术网

Search 配置单元:反向顺序搜索

Search 配置单元:反向顺序搜索,search,hive,Search,Hive,我有一个巨大的配置单元表,其中可能有数百万行,我希望在其中根据一列进行搜索(该列具有人类可读格式的时间)。基本上,我只希望搜索最近插入的行(比如在过去1小时内) 当我从表名中选择*时,它总是从一开始就返回结果。我必须比较每一行的时间,直到我到达最近插入的行,这是一项耗时的任务。有没有什么方法可以从最后一行开始搜索,然后反向移动,直到到达某一行 附加信息:表是根据日期进行分区的。您应该使用一个where子句,其中包含一个unix\u timestamp()函数,该函数具有存储时间的模式,只需选择您

我有一个巨大的配置单元表,其中可能有数百万行,我希望在其中根据一列进行搜索(该列具有人类可读格式的时间)。基本上,我只希望搜索最近插入的行(比如在过去1小时内)

当我从表名中选择*时,它总是从一开始就返回结果。我必须比较每一行的时间,直到我到达最近插入的行,这是一项耗时的任务。有没有什么方法可以从最后一行开始搜索,然后反向移动,直到到达某一行


附加信息:表是根据日期进行分区的。

您应该使用一个
where
子句,其中包含一个
unix\u timestamp()
函数,该函数具有存储时间的模式,只需选择您感兴趣的行(在您的情况下,时间戳大于“现在-一小时”的行)

如果您使用的是字符串列,我看不出如何优化它。如果你可以修改你的表,最好是有一个时间戳或日期列,并建立一个索引来加速查询,但是如果你必须对字符串列使用函数,恐怕索引在这里没有帮助


代码或SQL不能优化错误的设计选择(在需要进行任何类型计算的数据中使用字符串列,这只是一个错误的选择)。如果有一个日期列用于分区表,则可以添加一个子句以仅使用今天的日期(如果您对“now-x hours”感兴趣,则可以添加今天和昨天),但仅此而已。

您应该使用一个
where
子句,其中包括一个
unix\u timestamp()
函数和存储时间的模式,只需选择您感兴趣的行(在您的示例中,时间戳大于“now-1hour”的行)

如果您使用的是字符串列,我看不出如何优化它。如果你可以修改你的表,最好是有一个时间戳或日期列,并建立一个索引来加速查询,但是如果你必须对字符串列使用函数,恐怕索引在这里没有帮助


代码或SQL不能优化错误的设计选择(在需要进行任何类型计算的数据中使用字符串列,这只是一个错误的选择)。如果有一个日期列用于划分表,可以添加一个子句,只使用今天的日期(或者如果您对“now-x hours”感兴趣,则使用今天和昨天),但仅此而已。

能否将时间转换为时间戳?(使用带有模式的
unix_timestamp()
),然后将搜索限制在“now-1小时”的时间戳?我真的很困惑,为什么不能通过在查询中添加
where
子句来解决这个问题。@GoBrewers14因为时间是人类可读的格式(dd-MM-yy-HH-MM-ss.SSS-zzz)而且,无法直接比较两个这样的日期(包括时区)。默认情况下,比较是字典式的,而不是基于逻辑时间的比较。因此,正如@Jcl所说,将其转换为unix时间,并在where子句中搜索它……我不明白@Jcl“将unix_时间戳与模式一起使用”是什么意思?这里的模式是什么?你能将时间转换为时间戳吗?(使用带有模式的
unix_timestamp()
),然后将搜索限制在“now-1小时”的时间戳?我真的很困惑,为什么不能通过在查询中添加
where
子句来解决这个问题。@GoBrewers14因为时间是人类可读的格式(dd-MM-yy-HH-MM-ss.SSS-zzz)而且,无法直接比较两个这样的日期(包括时区)。默认情况下,比较是字典式的,而不是基于逻辑时间的比较。因此,正如@Jcl所说,将其转换为unix时间,并在where子句中搜索它……我不明白@Jcl“使用unix_时间戳和模式”是什么意思?这里的模式是什么?