Chociaż dokumentacja stwierdza zwraca wiersze losowo, nie jest to faktycznie prawda.
Zwraca "wybrane wiersze losowo", tak jak pojawia się w bazie danych, bez żadnego miejsca/kolejności według zdania. Oznacza to, że nie jest tak naprawdę losowy (lub losowo wybrany), jak można by pomyśleć, tylko, że kolejność, w której wiersze są zwracane, nie może zostać ustalona.
Gdy tylko uderzysz tam o numer order by x DESC limit 5
, zwróci on 5 ostatnich wierszy, z których wybierzesz.
dostać wiersze zwrócone w sposób losowy, trzeba by użyć czegoś takiego: order by rand() LIMIT 1
jednak może to mieć wpływ prędkości jeśli indeksy nie są ustawione prawidłowo. Zwykle robię min/max, aby uzyskać identyfikatory na stole, a następnie zrobić losową liczbę między nimi, a następnie wybrać te rekordy (w twoim przypadku byłby to tylko 1 rekord), który wydaje się być szybszy niż wykonanie bazy danych praca, zwłaszcza na dużym zbiorze
Nie wiem HIVE, więc nie odpowiem. W większości RDBMS losowość zadeklarowana w użyciu LIMIT wynika z faktu, że to, które wiersze otrzymasz, zależy od tego, jak optymalizator zdecyduje się je uzyskać. Innymi słowy, jeśli chcesz mieć określone wiersze, musisz zadeklarować je jawnie (zwykle z ORDER BY). Nie oznacza to, że silnik toczy się za każdym razem, gdy wykonujesz zapytanie, oznacza to tylko, że nie możesz oczekiwać, że wynik będzie zawsze taki sam. – Frazz
W takim przypadku, czy uważasz, że lepiej byłoby utworzyć sekwencję, przypisać do rekordów wyjściowych, a następnie wybrać losowo? Czy zdajesz sobie sprawę z jakiejkolwiek standardowej w branży metody pobierania prawdziwie losowych rekordów z dowolnego RDBMS? – visakh
Wydaje się, że 'HIVE' obsługuje' RAND() '. Tak więc myślę, wykonując 'ORDER BY RAND()', a następnie 'LIMIT 1' działa. – visakh