pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

<i id='y9BjT'><tr id='y9BjT'><dt id='y9BjT'><q id='y9BjT'><span id='y9BjT'><b id='y9BjT'><form id='y9BjT'><ins id='y9BjT'></ins><ul id='y9BjT'></ul><sub id='y9BjT'></sub></form><legend id='y9BjT'></legend><bdo id='y9BjT'><pre id='y9BjT'><center id='y9BjT'></center></pre></bdo></b><th id='y9BjT'></th></span></q></dt></tr></i><div class="s3e8alz" id='y9BjT'><tfoot id='y9BjT'></tfoot><dl id='y9BjT'><fieldset id='y9BjT'></fieldset></dl></div>

<tfoot id='y9BjT'></tfoot>

    1. <legend id='y9BjT'><style id='y9BjT'><dir id='y9BjT'><q id='y9BjT'></q></dir></style></legend>

      • <bdo id='y9BjT'></bdo><ul id='y9BjT'></ul>
    2. <small id='y9BjT'></small><noframes id='y9BjT'>

        如何有效地使用窗口函數根據 N 個先前值來決定

        How to use windowing functions efficiently to decide next N number of rows based on N number of previous values(如何有效地使用窗口函數根據 N 個先前值來決定接下來的 N 個行)
        <legend id='WCXeD'><style id='WCXeD'><dir id='WCXeD'><q id='WCXeD'></q></dir></style></legend>

          <small id='WCXeD'></small><noframes id='WCXeD'>

            <bdo id='WCXeD'></bdo><ul id='WCXeD'></ul>

              <tbody id='WCXeD'></tbody>
            <i id='WCXeD'><tr id='WCXeD'><dt id='WCXeD'><q id='WCXeD'><span id='WCXeD'><b id='WCXeD'><form id='WCXeD'><ins id='WCXeD'></ins><ul id='WCXeD'></ul><sub id='WCXeD'></sub></form><legend id='WCXeD'></legend><bdo id='WCXeD'><pre id='WCXeD'><center id='WCXeD'></center></pre></bdo></b><th id='WCXeD'></th></span></q></dt></tr></i><div class="d28ewf3" id='WCXeD'><tfoot id='WCXeD'></tfoot><dl id='WCXeD'><fieldset id='WCXeD'></fieldset></dl></div>

            • <tfoot id='WCXeD'></tfoot>
                  本文介紹了如何有效地使用窗口函數根據 N 個先前值來決定接下來的 N 個行的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

                  問題描述

                  我有以下數據.

                  +----------+----+-------+-----------------------+
                  |      date|item|avg_val|conditions             |
                  +----------+----+-------+-----------------------+
                  |01-10-2020|   x|     10|                      0|
                  |02-10-2020|   x|     10|                      0|
                  |03-10-2020|   x|     15|                      1|
                  |04-10-2020|   x|     15|                      1|
                  |05-10-2020|   x|      5|                      0|
                  |06-10-2020|   x|     13|                      1|
                  |07-10-2020|   x|     10|                      1|
                  |08-10-2020|   x|     10|                      0|
                  |09-10-2020|   x|     15|                      1|
                  |01-10-2020|   y|     10|                      0|
                  |02-10-2020|   y|     18|                      0|
                  |03-10-2020|   y|      6|                      1|
                  |04-10-2020|   y|     10|                      0|
                  |05-10-2020|   y|     20|                      0|
                  +----------+----+-------+-----------------------+
                  

                  我正在嘗試基于

                  1. 如果標志值為 0,則新列值將為 0.
                  2. 如果標志為 1,則新列將為 1,接下來的四個 N 行數將為零,即無需檢查下一個 N 值.此過程將應用于每個項目,即按項目分區將起作用.

                  我在這里使用了 N = 4,

                  I have used here N = 4,

                  我已經使用了下面的代碼,但沒有有效的窗口函數是否有任何優化的方法.

                  I have used the below code but not effienntly windowing function is there any optimized way.

                  DROP TEMPORARY TABLE t2;
                  CREATE TEMPORARY TABLE t2
                  SELECT *,
                  MAX(conditions) OVER (PARTITION BY item ORDER BY item,`date` ROWS 4 PRECEDING ) AS new_row
                  FROM record
                  ORDER BY item,`date`;
                  
                   
                  
                   DROP TEMPORARY TABLE t3;
                  CREATE TEMPORARY TABLE t3
                  SELECT *,ROW_NUMBER() OVER (PARTITION BY item,new_row ORDER BY item,`date`) AS e FROM t2;
                  
                   
                  
                  
                  SELECT *,CASE WHEN new_row=1 AND e%5>1 THEN 0 
                  WHEN new_row=1 AND e%5=1 THEN 1 ELSE 0 END AS flag FROM t3;
                  

                  輸出類似于

                  +----------+----+-------+-----------------------+-----+
                  |      date|item|avg_val|conditions             |flag |
                  +----------+----+-------+-----------------------+-----+
                  |01-10-2020|   x|     10|                      0|    0|
                  |02-10-2020|   x|     10|                      0|    0|
                  |03-10-2020|   x|     15|                      1|    1|
                  |04-10-2020|   x|     15|                      1|    0|
                  |05-10-2020|   x|      5|                      0|    0|
                  |06-10-2020|   x|     13|                      1|    0|
                  |07-10-2020|   x|     10|                      1|    0|
                  |08-10-2020|   x|     10|                      0|    0|
                  |09-10-2020|   x|     15|                      1|    1|
                  |01-10-2020|   y|     10|                      0|    0|
                  |02-10-2020|   y|     18|                      0|    0|
                  |03-10-2020|   y|      6|                      1|    1|
                  |04-10-2020|   y|     10|                      0|    0|
                  |05-10-2020|   y|     20|                      0|    0|
                  +----------+----+-------+-----------------------+-----+
                  

                  但是我無法獲得輸出,我嘗試了更多.

                  But i am unable to get the ouput , i have tried more.

                  推薦答案

                  正如評論中所建議的(@nbk 和 @Akina),您將需要某種迭代器來實現邏輯.對于 SparkSQL 和 Spark 2.4+ 版,我們可以使用內置函數 aggregate 并設置一個結構數組和一個計數器作為累加器.下面是一個名為 record 的示例數據框和表(假設 conditions 列中的值為 01):

                  As suggested in the comments(by @nbk and @Akina), you will need some sort of iterator to implement the logic. With SparkSQL and Spark version 2.4+, we can use the builtin function aggregate and set an array of structs plus a counter as the accumulator. Below is an example dataframe and table named record(assume values in conditions column are either 0 or 1):

                  val df = Seq(
                      ("01-10-2020", "x", 10, 0), ("02-10-2020", "x", 10, 0), ("03-10-2020", "x", 15, 1),
                      ("04-10-2020", "x", 15, 1), ("05-10-2020", "x", 5, 0), ("06-10-2020", "x", 13, 1),
                      ("07-10-2020", "x", 10, 1), ("08-10-2020", "x", 10, 0), ("09-10-2020", "x", 15, 1),
                      ("01-10-2020", "y", 10, 0), ("02-10-2020", "y", 18, 0), ("03-10-2020", "y", 6, 1),
                      ("04-10-2020", "y", 10, 0), ("05-10-2020", "y", 20, 0)
                  ).toDF("date", "item", "avg_val", "conditions")
                  
                  df.createOrReplaceTempView("record")
                  

                  SQL:

                  spark.sql("""
                    SELECT t1.item, m.*
                    FROM (
                      SELECT item,
                        sort_array(collect_list(struct(date,avg_val,int(conditions) as conditions,conditions as flag))) as dta
                      FROM record
                      GROUP BY item
                    ) as t1 LATERAL VIEW OUTER inline(
                      aggregate(
                        /* expr: set up array `dta` from the 2nd element to the last 
                         *       notice that indices for slice function is 1-based, dta[i] is 0-based
                         */
                        slice(dta,2,size(dta)),
                        /* start: set up and initialize `acc` to a struct containing two fields:
                         * - dta: an array of structs with a single element dta[0]
                         * - counter: number of rows after flag=1, can be from `0` to `N+1`
                         */
                        (array(dta[0]) as dta, dta[0].conditions as counter),
                        /* merge: iterate through the `expr` using x and update two fields of `acc`
                         * - dta: append values from x to acc.dta array using concat + array functions
                         *        update flag using `IF(acc.counter IN (0,5) and x.conditions = 1, 1, 0)`
                         * - counter: increment by 1 if acc.counter is between 1 and 4
                         *            , otherwise set value to x.conditions
                         */
                        (acc, x) -> named_struct(
                            'dta', concat(acc.dta, array(named_struct(
                                'date', x.date,
                                'avg_val', x.avg_val,
                                'conditions', x.conditions,
                                'flag', IF(acc.counter IN (0,5) and x.conditions = 1, 1, 0)
                              ))),
                            'counter', IF(acc.counter > 0 and acc.counter < 5, acc.counter+1, x.conditions)
                          ),
                        /* finish: retrieve acc.dta only and discard acc.counter */
                        acc -> acc.dta
                      )
                    ) m
                  """).show(50)
                  

                  結果:

                  +----+----------+-------+----------+----+
                  |item|      date|avg_val|conditions|flag|
                  +----+----------+-------+----------+----+
                  |   x|01-10-2020|     10|         0|   0|
                  |   x|02-10-2020|     10|         0|   0|
                  |   x|03-10-2020|     15|         1|   1|
                  |   x|04-10-2020|     15|         1|   0|
                  |   x|05-10-2020|      5|         0|   0|
                  |   x|06-10-2020|     13|         1|   0|
                  |   x|07-10-2020|     10|         1|   0|
                  |   x|08-10-2020|     10|         0|   0|
                  |   x|09-10-2020|     15|         1|   1|
                  |   y|01-10-2020|     10|         0|   0|
                  |   y|02-10-2020|     18|         0|   0|
                  |   y|03-10-2020|      6|         1|   1|
                  |   y|04-10-2020|     10|         0|   0|
                  |   y|05-10-2020|     20|         0|   0|
                  +----+----------+-------+----------+----+
                  

                  地點:

                  1. 使用 groupby 將同一項目的行收集到名為 dta 列的結構數組中,該列具有 4 個字段:dateavg_valconditionsflag 并按 date
                  2. 排序
                  3. 使用aggregate函數遍歷上述結構體數組,根據counterconditions更新flag字段strong>(詳情見上面SQL代碼注釋)
                  4. 使用 Lateral VIEW 和 inline 函數分解來自聚合函數的結果結構數組
                  1. use groupby to collect rows for the same item into an array of structs named dta column with 4 fields: date, avg_val, conditions and flag and sorted by date
                  2. use aggregate function to iterate through the above array of structs, update the flag field based on counter and conditions (details see the above SQL code comments)
                  3. use Lateral VIEW and inline function to explode the resulting array of structs from the aggregate function

                  注意事項:

                  (1) 建議的 SQL 適用于 N=4,其中我們有 acc.counter IN (0,5)acc.counter <;5 在 SQL 中.對于任何 N,將上述調整為:acc.counter IN (0,N+1)acc.counter <;N+1,下圖為N=2 相同樣本數據的結果:

                  (1) the proposed SQL is for N=4, where we have acc.counter IN (0,5) and acc.counter < 5 in the SQL. For any N, adjust the above to: acc.counter IN (0,N+1) and acc.counter < N+1, the below shows the result for N=2 with the same sample data:

                  +----+----------+-------+----------+----+
                  |item|      date|avg_val|conditions|flag|
                  +----+----------+-------+----------+----+
                  |   x|01-10-2020|     10|         0|   0|
                  |   x|02-10-2020|     10|         0|   0|
                  |   x|03-10-2020|     15|         1|   1|
                  |   x|04-10-2020|     15|         1|   0|
                  |   x|05-10-2020|      5|         0|   0|
                  |   x|06-10-2020|     13|         1|   1|
                  |   x|07-10-2020|     10|         1|   0|
                  |   x|08-10-2020|     10|         0|   0|
                  |   x|09-10-2020|     15|         1|   1|
                  |   y|01-10-2020|     10|         0|   0|
                  |   y|02-10-2020|     18|         0|   0|
                  |   y|03-10-2020|      6|         1|   1|
                  |   y|04-10-2020|     10|         0|   0|
                  |   y|05-10-2020|     20|         0|   0|
                  +----+----------+-------+----------+----+
                  

                  (2) 我們使用dta[0] 來初始化acc,它包括其字段的值和數據類型.理想情況下,我們應該確保這些字段的數據類型正確,以便正確進行所有計算.例如在計算 acc.counter 時,如果 conditions 是 StringType,acc.counter+1 將返回一個帶有 DoubleType 值的 StringType

                  (2) we use dta[0] to initialize acc which includes both the values and datatypes of its fields. Ideally, we should make sure data types of these fields right so that all calculations are correctly conducted. for example when calculating acc.counter, if conditions is StringType, acc.counter+1 will return a StringType with a DoubleType value

                  spark.sql("select '2'+1").show()
                  +---------------------------------------+
                  |(CAST(2 AS DOUBLE) + CAST(1 AS DOUBLE))|
                  +---------------------------------------+
                  |                                    3.0|
                  +---------------------------------------+
                  

                  當使用 acc.counter IN (0,5)acc.counter 將其值與整數進行比較時,可能會產生浮點錯誤.5.根據 OP 的反饋,這產生了錯誤的結果,沒有任何警告/錯誤消息.

                  Which could yield floating-point errors when comparing their value with integers using acc.counter IN (0,5) or acc.counter < 5. Based on OP's feedback, this produced incorrect result without any WARNING/ERROR message.

                  • 一種解決方法是在設置聚合函數的第二個參數時使用 CAST 指定確切的字段類型,以便在任何類型不匹配時報告錯誤,見下文:

                  • One workaround is to specify exact field types using CAST when setting up the 2nd argument of aggregate function so it reports ERROR when any types mismatch, see below:

                  CAST((array(dta[0]), dta[0].conditions) as struct<dta:array<struct<date:string,avg_val:string,conditions:int,flag:int>>,counter:int>),
                  

                1. 另一種在創建 dta 列時強制類型的解決方案,在此示例中,請參閱以下代碼中的 int(conditions) as conditions:

                2. Another solution it to force types when creating dta column, in this example, see int(conditions) as conditions in below code:

                  SELECT item,
                    sort_array(collect_list(struct(date,avg_val,int(conditions) as conditions,conditions as flag))) as dta
                  FROM record
                  GROUP BY item
                  

                3. 我們也可以在計算中強制使用數據類型,例如,參見下面的int(acc.counter+1):

                  IF(acc.counter > 0 and acc.counter < 5, int(acc.counter+1), x.conditions)      
                  

                4. 這篇關于如何有效地使用窗口函數根據 N 個先前值來決定接下來的 N 個行的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

                  【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

                  相關文檔推薦

                  reuse the result of a select expression in the quot;GROUP BYquot; clause?(在“GROUP BY中重用選擇表達式的結果;條款?)
                  Does ignore option of Pyspark DataFrameWriter jdbc function ignore entire transaction or just offending rows?(Pyspark DataFrameWriter jdbc 函數的 ignore 選項是忽略整個事務還是只是有問題的行?) - IT屋-程序員軟件開發技
                  Error while using INSERT INTO table ON DUPLICATE KEY, using a for loop array(使用 INSERT INTO table ON DUPLICATE KEY 時出錯,使用 for 循環數組)
                  pyspark mysql jdbc load An error occurred while calling o23.load No suitable driver(pyspark mysql jdbc load 調用 o23.load 時發生錯誤 沒有合適的驅動程序)
                  How to integrate Apache Spark with MySQL for reading database tables as a spark dataframe?(如何將 Apache Spark 與 MySQL 集成以將數據庫表作為 Spark 數據幀讀取?)
                  In Apache Spark 2.0.0, is it possible to fetch a query from an external database (rather than grab the whole table)?(在 Apache Spark 2.0.0 中,是否可以從外部數據庫獲取查詢(而不是獲取整個表)?) - IT屋-程序員軟件開
                5. <i id='JePBC'><tr id='JePBC'><dt id='JePBC'><q id='JePBC'><span id='JePBC'><b id='JePBC'><form id='JePBC'><ins id='JePBC'></ins><ul id='JePBC'></ul><sub id='JePBC'></sub></form><legend id='JePBC'></legend><bdo id='JePBC'><pre id='JePBC'><center id='JePBC'></center></pre></bdo></b><th id='JePBC'></th></span></q></dt></tr></i><div class="cv88eg2" id='JePBC'><tfoot id='JePBC'></tfoot><dl id='JePBC'><fieldset id='JePBC'></fieldset></dl></div>
                  • <tfoot id='JePBC'></tfoot>

                      <legend id='JePBC'><style id='JePBC'><dir id='JePBC'><q id='JePBC'></q></dir></style></legend>

                        <small id='JePBC'></small><noframes id='JePBC'>

                        • <bdo id='JePBC'></bdo><ul id='JePBC'></ul>
                            <tbody id='JePBC'></tbody>

                            主站蜘蛛池模板: 温湿度记录纸_圆盘_横河记录纸|霍尼韦尔记录仪-广州汤米斯机电设备有限公司 | 大_小鼠elisa试剂盒-植物_人Elisa试剂盒-PCR荧光定量试剂盒-上海一研生物科技有限公司 | MES系统-WMS系统-MES定制开发-制造执行MES解决方案-罗浮云计算 | 拉伸膜,PE缠绕膜,打包带,封箱胶带,包装膜厂家-东莞宏展包装 | 纸布|钩编布|钩针布|纸草布-莱州佳源工艺纸布厂 | 超高频感应加热设备_高频感应电源厂家_CCD视觉检测设备_振动盘视觉检测设备_深圳雨滴科技-深圳市雨滴科技有限公司 | 刘秘书_你身边专业的工作范文写作小秘书 | 衬塑管道_衬四氟管道厂家-淄博恒固化工设备有限公司 | 365文案网_全网创意文案句子素材站| 网站seo优化_seo云优化_搜索引擎seo_启新网络服务中心 | 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | PCB设计,PCB抄板,电路板打样,PCBA加工-深圳市宏力捷电子有限公司 | 塑料异型材_PVC异型材_封边条生产厂家_PC灯罩_防撞扶手_医院扶手价格_东莞市怡美塑胶制品有限公司 | 专业的新乡振动筛厂家-振动筛品质保障-环保振动筛价格—新乡市德科筛分机械有限公司 | 石英砂矿石色选机_履带辣椒色选机_X光异物检测机-合肥幼狮光电科技 | 高速混合机_锂电混合机_VC高效混合机-无锡鑫海干燥粉体设备有限公司 | 杭州双螺杆挤出机-百科 | 湖南自考_湖南自学考试网 | 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 | 炒货机-炒菜机-炒酱机-炒米机@霍氏机械 | 仿真植物|仿真树|仿真花|假树|植物墙 - 广州天昆仿真植物有限公司 | 贵州成人高考网_贵州成考网| 不锈钢管件(不锈钢弯头,不锈钢三通,不锈钢大小头),不锈钢法兰「厂家」-浙江志通管阀 | 单锥双螺旋混合机_双螺旋锥形混合机-无锡新洋设备科技有限公司 | 头条搜索极速版下载安装免费新版,头条搜索极速版邀请码怎么填写? - 欧远全 | 电线电缆厂家|沈阳电缆厂|电线厂|沈阳英联塑力线缆有限公司 | 风淋室生产厂家报价_传递窗|送风口|臭氧机|FFU-山东盛之源净化设备 | 卫浴散热器,卫浴暖气片,卫生间背篓暖气片,华圣格浴室暖气片 | 湖州织里童装_女童男童中大童装_款式多尺码全_织里儿童网【官网】-嘉兴嘉乐网络科技有限公司 | 卫生纸复卷机|抽纸机|卫生纸加工设备|做卫生纸机器|小型卫生纸加工需要什么设备|卫生纸机器设备多少钱一台|许昌恒源纸品机械有限公司 | 企业彩铃制作_移动、联通、电信集团彩铃上传开通_彩铃定制_商务彩铃管理平台-集团彩铃网 | 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | 安全,主动,被动,柔性,山体滑坡,sns,钢丝绳,边坡,防护网,护栏网,围栏,栏杆,栅栏,厂家 - 护栏网防护网生产厂家 | 扒渣机厂家_扒渣机价格_矿用扒渣机_铣挖机_撬毛台车_襄阳永力通扒渣机公司 | 盛源真空泵|空压机-浙江盛源空压机制造有限公司-【盛源官网】 | 仓储货架_南京货架_钢制托盘_仓储笼_隔离网_环球零件盒_诺力液压车_货架-南京一品仓储设备制造公司 | 专业甜品培训学校_广东糖水培训_奶茶培训_特色小吃培训_广州烘趣甜品培训机构 | 薄壁轴承-等截面薄壁轴承生产厂家-洛阳薄壁精密轴承有限公司 | 章丘丰源机械有限公司 - 三叶罗茨风机,罗茨鼓风机,罗茨风机 | ISO9001认证咨询_iso9001企业认证代理机构_14001|18001|16949|50430认证-艾世欧认证网 | 淄博不锈钢无缝管,淄博不锈钢管-鑫门物资有限公司 |