Diese Abfrage mit einer kryptischen Auswertung Fehler versagt:Warum schlägt dieser Hive-QL-Ausdruck fehl?
select printf("%08x", reflect('java.lang.Integer', 'reverseBytes', mhash3('123', 0)));
(Hier ist die Ausnahme)
Failed with exception java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException: Error evaluating printf('%08x', reflect('java.lang.Integer','reverseBytes',1))
Was ich versuche, konsequent eine Java-Implementierung eines murmur3 Hash-hex zu reproduzieren ist zu erreichen Wert, der die Hash-Methode getBytes
verwendet, die sie im Big-Endian-Format zurückgibt (und Dezimalziffern werden in Little-Endian geschrieben), wodurch das Byte in der Ganzzahl getauscht wird.
jeden Teil der separate Abfrage Doing funktioniert perfekt, es ist die printf Mischen und das widerspiegelt, was nicht ... Und nur, wenn die Formatierung ist eine Zahl, Art, so funktioniert das:
select printf("%s", reflect('java.lang.Integer', 'reverseBytes', mhash3('123', 0)));
aber auch
select printf("%d", reflect('java.lang.Integer', 'reverseBytes', mhash3('123', 0)));
versagt und ich habe dafür gesorgt, dass das Ergebnis ein numerischer Typ ist und kein String, da ich es arithmetische Operationen tun, wie:
select printf("%s", 10 * reflect('java.lang.Integer', 'reverseBytes', mhash3('123', 0)));
Bisher musste ich keine benutzerdefinierten UDFs hinzufügen. Wenn es eine Abhilfe gibt, möchte ich das so behalten.
Es gibt eine große Lücke zwischen * sein könnte: „Ich kann auf sie Arithmetik tun, weil irgendwie funktioniert die JVM etwas Magie auf doof Objekt-Wrapper“ * und * "es ist eine Basis numerischer Typ, dass' printf' verarbeiten kann direkt"*. Haben Sie versucht, dieses böse Integer-Objekt in eine altmodische IEEE-Ganzzahl (a.k.a.. "int") zu "werfen", bevor Sie es in "printf()" eingeben? –
Um genau zu sein, meine ich die SQL-Syntax 'cast (' _expr_ 'as int)' –
oh Mist, das funktioniert! Wenn du diesen Kommentar als Antwort schreibst, kann ich das akzeptieren :) – fortran