tutorial - what is mysql




हाइव/एसक्यूएल में अधिकतम मूल्य के साथ पंक्ति प्राप्त करें? (3)

आप collect_max ( http://github.com/klout/brickhouse ) से collect_max यूडीएफ का उपयोग कर सकते हैं, इस समस्या को हल करने के लिए, 1 के मान से गुजारें, जिसका अर्थ है कि आप केवल एक अधिकतम मान चाहते हैं।

select array_index( map_keys( collect_max( carrier_id, meandelay, 1) ), 0 ) from flightinfo;

इसके अलावा, मैंने कहीं पढ़ा है कि Hive max UDF आपको पंक्ति में अन्य फ़ील्ड तक पहुंचने की अनुमति देता है, लेकिन मुझे लगता है कि collect_max का उपयोग करना आसान है।

मैं हाइव / एसक्यूएल के लिए नया हूँ, और मैं काफी सरल समस्या पर फंस गया हूँ। मेरा डेटा दिखता है:

+------------+--------------------+-----------------------+
| carrier_iD |     meandelay      |     meancanceled      |
+------------+--------------------+-----------------------+
| EV         | 13.795802119653473 | 0.028584251044292006  |
| VX         | 0.450591016548463  | 2.364066193853424E-4  |
| F9         | 10.898001378359766 | 0.00206753962784287   |
| AS         | 0.5071547420965062 | 0.0057404326123128135 |
| HA         | 1.2031093279839498 | 5.015045135406214E-4  |
| 9E         | 8.147899230704216  | 0.03876067292247866   |
| B6         | 9.45383857757506   | 0.003162096314343487  |
| UA         | 8.101511665305816  | 0.005467725574605967  |
| FL         | 0.7265068895709532 | 0.0041141513746490044 |
| WN         | 7.156119279121648  | 0.0057419058192869415 |
| DL         | 4.206288692245839  | 0.005123990066804269  |
| YV         | 6.316802855264404  | 0.029304029304029346  |
| US         | 3.2221527095063736 | 0.007984031936127766  |
| OO         | 6.954715814690328  | 0.02596499362466706   |
| MQ         | 9.74568222216328   | 0.025628100708354324  |
| AA         | 8.720522654298968  | 0.019242775597574157  |
+------------+--------------------+-----------------------+

मैं चाहता हूं कि हाइव को पंक्ति के साथ मतलब वापस करें, अधिकतम अधिकतम मूल्य। मेरे पास है:

SELECT CAST(MAX(meandelay) as FLOAT) FROM flightinfo;

जो वास्तव में अधिकतम देता है (मैं डाली करता हूं क्योंकि मेरे मूल्यों को STRING के रूप में सहेजा गया है) तो फिर:

SELECT * FROM flightinfo WHERE meandelay = (SELECT CAST(MAX(meandelay) AS FLOAT) FROM flightinfo);

मुझे निम्नलिखित त्रुटि मिलती है:

FAILED: ParseException line 1:44 cannot recognize input near 'select' 'cast' '(' in expression specification

इसके बजाय उपयोग करें।

SELECT a.* FROM flightinfo a left semi join  
(SELECT CAST(MAX(meandelay) AS FLOAT)  
maxdelay FROM flightinfo)b on (a.meandelay=b.maxdelay)

विंडोिंग और एनालिटिक्स फ़ंक्शंस का उपयोग करें

SELECT carrier_id, meandelay, meancanceled
FROM
 (SELECT carrier_id, meandelay, meancanceled,
         rank() over (order by cast(meandelay as float) desc) as r 
  FROM table) S 
WHERE S.r = 1;

यह समस्या को भी हल करेगा यदि एक से अधिक पंक्ति में एक ही अधिकतम मूल्य होता है, तो आपको परिणाम के रूप में सभी पंक्तियां मिल जाएंगी। यदि आप एक पंक्ति पंक्ति rank() को row_number() या order by दूसरे शब्द को जोड़ना चाहते हैं।





hive