hive वर्टिका-क्या अंतिम दृश्य कार्यक्षमता है?



vertica (1)

वास्तव में आपके पास एक परिदृश्य है जो आपकी आवश्यकताओं को पूरा कर सकता है:

इस से बाहर:

id|day_strt           |sales_01 |sales_02 |sales_03 |sales_04 |sales_05 |sales_06
 1|2016-01-19 08:00:00| 1,842.25| 5,449.40|-        |39,776.86|-        | 9,424.10
 2|2016-01-19 08:00:00|73,810.66|-        | 9,867.70|-        |76,723.91|95,605.14

इसे बनाएं:

id|day_strt           |sales_01 |sales_02 |sales_03 |sales_04 |sales_05 |sales_06
 1|2016-01-19 08:00:00| 1,842.25| 5,449.40|22,613.13|39,776.86|24,600.48| 9,424.10
 2|2016-01-19 08:00:00|73,810.66|41,839.18| 9,867.70|43,295.81|76,723.91|95,605.14

01 से 06 का दिन का एन-थ घंटा है जब बिक्री दर्ज की गई थी, 08:00 से शुरू

प्रारंभिक इनपुट डेटा सहित संपूर्ण परिदृश्य नीचे है।

  1. एक चयन के रूप में इनपुट डेटा .. सभी का चयन करें ...
  2. एक मेज जिसमें क्रॉस के लिए 6 पूर्णांक मिलते हैं 1 की तालिका में शामिल हों
  3. ऊर्ध्वाधर धुरी: क्रॉस 6 पूर्णांक के साथ इनपुट में शामिल होते हैं, और सूचकांक के आधार पर, केवल एक एनएसी अभिव्यक्ति में विक्रय कॉलम का उत्पादन होता है। अंत में, एक ही मामले अभिव्यक्ति शून्य के मूल्यांकन के लिए जहां कहीं भी फ़िल्टर करें।
  4. TIMESERIES खंड और रैखिक प्रक्षेप का उपयोग करके अंतराल को भरें: बिक्री के आंकड़े और अनुक्रमण स्तंभ भी।
  5. अंतिम क्वेरी में फिर से क्षैतिज पिवट सब कुछ।

तालिका के सभी स्तंभों पर एक यूनियन की तुलना में अधिक प्रदर्शनकर्ता, मैं आपको गारंटी देता हूं कि

यहाँ जाता हैं:

WITH
-- input 
input(id,day_strt,sales_01,sales_02,sales_03,sales_04,sales_05,sales_06) AS (
          SELECT 1,'2016-01-19 08:00:00'::TIMESTAMP(0), 1842.25, 5449.40 ,NULL::INT,39776.86 ,NULL::INT, 9424.10
UNION ALL SELECT 2,'2016-01-19 08:00:00'::TIMESTAMP(0),73810.66 ,NULL::INT, 9867.70 ,NULL::INT,76723.91 ,95605.14
)
-- debug
-- SELECT * FROM input;
,
-- 6 months to pivot vertically -> 6 integers
six_idxs(idx) AS (
          SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
)
,
-- pivot input vertically and remove rows with null measures
-- (could probably add the TIMESERIES clause here directly,
-- but less readable and maintainable)
vert_pivot AS (
SELECT
  id
, idx 
, TIMESTAMPADD(HOUR,idx-1,day_strt)::TIMESTAMP(0) AS sales_ts
, CASE idx
    WHEN 1 THEN  sales_01
    WHEN 2 THEN  sales_02
    WHEN 3 THEN  sales_03
    WHEN 4 THEN  sales_04
    WHEN 5 THEN  sales_05
    WHEN 6 THEN  sales_06
  END AS sales
FROM input
CROSS JOIN six_idxs
WHERE (
    CASE idx
      WHEN 1 THEN  sales_01
      WHEN 2 THEN  sales_02
      WHEN 3 THEN  sales_03
      WHEN 4 THEN  sales_04
      WHEN 5 THEN  sales_05
      WHEN 6 THEN  sales_06
    END
  ) IS NOT NULL
)
-- debug:
-- SELECT * FROM vert_pivot;
,
-- gap filling and interpolation
gaps_filled AS (
SELECT
  id
, TS_FIRST_VALUE(idx,'LINEAR')   AS idx
, tm_sales_ts::TIMESTAMP(0) AS sales_ts
, TS_FIRST_VALUE(sales,'LINEAR') AS sales
FROM vert_pivot
TIMESERIES tm_sales_ts AS '1 HOUR' OVER(
  PARTITION BY id ORDER BY sales_ts
  )
)
-- debug
-- SELECT * FROM gaps_filled ORDER BY 1,2;
-- pivot horizontally; final query
SELECT
  id
, MIN(sales_ts) AS day_strt
, SUM(CASE idx WHEN 1 THEN sales END)::NUMERIC(7,2) AS sales_01
, SUM(CASE idx WHEN 2 THEN sales END)::NUMERIC(7,2) AS sales_02
, SUM(CASE idx WHEN 3 THEN sales END)::NUMERIC(7,2) AS sales_03
, SUM(CASE idx WHEN 4 THEN sales END)::NUMERIC(7,2) AS sales_04
, SUM(CASE idx WHEN 5 THEN sales END)::NUMERIC(7,2) AS sales_05
, SUM(CASE idx WHEN 6 THEN sales END)::NUMERIC(7,2) AS sales_06
FROM gaps_filled
GROUP BY id
ORDER BY id
;

खुश खेल -

मार्को द साने

टाइमसिरीज़ प्रक्षेप / अंतराल भरने के लिए एक मैट्रिक्स को घुमाने की आवश्यकता है, और गन्दा और अक्षम यूनिअन सभी दृष्टिकोण से बचने के लिए चाहते हैं। क्या हाइव के लैटरल व्यू एक्सप्ले कार्यक्षमता Vertica में उपलब्ध है?

संपादित करें: @ मरेकोतोथेन - आपके रोचक परिदृश्य के लिए धन्यवाद - मुझे प्रक्षेप के लिए अपना दृष्टिकोण पसंद है I मैं इसे और अधिक के साथ खेलेंगे और देखेंगे कि यह कैसे चला जाता है। उम्मीद तो दिखती है।

एफवाईआई - यहां एक ऐसा समाधान है, जिसे मैं साथ आया हूं - मेरा परिदृश्य यह है कि मैं समय-समय पर मेरिज एक्सेस (और उपयोगकर्ता / संसाधन पूल आदि) मूल रूप से एक लागत मीट्रिक प्राप्त करने की कोशिश कर रहा हूं। मुझे प्रक्षेप करने की आवश्यकता है ताकि समय में किसी भी समय मैं कुल उपयोग देख सकूं। तो ये मेरी क्वेरी है जो बार-बार दूसरी बार स्लिस करता है, फिर मिनट द्वारा "मेगाबाइट सेकंडेक्स" का मीट्रिक देने के लिए समुच्चय।

with qry_cte as
(
select 
session_id
, request_id
, date_trunc('second',start_timestamp) as dat_str
, timestampadd('ss'
    , ceiling(request_duration_ms/1000)::int
    , date_trunc('second',start_timestamp)
    ) as dat_end
, ceiling(request_duration_ms/1000)::int as secs
, memory_acquired_mb
from query_requests
where request_type = 'QUERY'
and request_duration_ms > 0
and memory_acquired_mb > 0
)

select date_trunc('minute',slice_time) as dat_minute
, count(distinct session_id ||  request_id::varchar) as queries
, sum(memory_acquired_mb) as mb_seconds
from (
select session_id, request_id, slice_time, ts_first_value(memory_acquired_mb) as memory_acquired_mb
from (
select session_id, request_id, dat_str as dat, memory_acquired_mb from qry_cte
union all
select session_id, request_id, dat_end as dat, memory_acquired_mb from qry_cte
) x
timeseries slice_time as '1 second' over (partition by session_id, request_id order by dat)
) x
group by 1 order by 1 desc
;