Transit-TAG

QinQ传输中TAG的添加删除交换规则,涉及到UNI和ENNI和INNI,MPLSNNI没有TAG概念,VLAN=TPID+VLANID+CFI+Priority

tag

1.      TAG


vsi_uni_new

 


UNI在基于PORT的时候对UNTAGPRIORITY TAG(VLANID=0的TAG)报文可以进行预先处理,这些通过命名为PRIORITYTAG分类表来工作

PRIORITYTAG分类表:

KEYLPORT+UNTAG+VLANID+VLAN PRIORITY

RESULTDISCARDADD,SWAP,REMOVEAdd or SWAP RM s VLANIDVLAN PRIORITY, VSIIDDSCPP2POR2MPSELF VSIINTERFACE,出口VSIINTERFACE2MP的时候=GROUPID

对于PORT87UNTAG转换为100TAG+优先级为2的报文

TAG200的转换为300的报文

0LPORT=87 UNTAG=1—ADD=1 VLANID=100 VLAN PRIORITY=2 VSIID SELF VSIINTERFACE

1LPORT=87 UNTAG=0 VLANID=200—SWAP=1 VLANID=300 VSIID SELF VSIINTERFACE

2LPORT=87 UNTAG=0 VLANID=100 VLAN PRIORITY=2—REMOVE=1 VLANID=100DISCARD作用是无法进入,但是可以出去,因为表2是提供给出口用的)

3LPORT=87 UNTAG=0 VLANID=300—REMOVE=1 VLANID=200DISCARD同表2

 

NNI

NNI的话和UNI一样处理,但是NNI少了UNTAG和PRIORITY TAG(VLANID=0的TAG)处理

NNI分类表:

KEYLPORT+VLANID+VLAN PRIORITY(对比UNI少了UNTAG标记)

RESULTDISCARDADD,SWAP,REMOVEAdd or SWAP RM s VLANIDVLAN PRIORITY, VSIIDDSCP P2POR2MPSELF VSIINTERFACE,出口VSIINTERFACE2MP的时候=GROUPID

入口的时候的表:

0LPORT=87 VLANID—REMOVE=1 VSIID SELF VSIINTERFACE

直接删除STAG

出口的时候更换STAG的话在添加上去


2.      TPID

TPID是基于端口设置的,主要用来区分不同厂商的VLAN设置,在出入端口设置就可以

INPORT表:

KEYPORT

RESULTPORTTYPEMIRROR PORTTPID

OUTPORT表:

KEYPORT

RESULTPORTYPEMIRROR PORTTPIDLOCALMAC

 

<think>我们遇到了一个错误:`Nomatchingfunctionwithsignature:trunc(datev2,varchar(*))`。这意味着`trunc`函数不支持`datev2`类型和`varchar`类型的组合参数。在Hive中,`trunc`函数通常用于截断日期,但可能对日期类型有要求。根据引用[1]中提到的,`date_trunc`函数在Hive中用于截断日期,其语法为:```sqldate_trunc('field',source)```其中,`'field'`是字符串,表示要截断到的单位(如'month'),`source`是日期或时间戳。但是,我们的代码中使用了`trunc(calendar_date,'mm')`,这里`trunc`函数有两个参数:第一个是日期,第二个是字符串。而错误信息表明,函数签名不匹配,可能是因为`calendar_date`是`datev2`类型(或类似的新日期类型)而Hive的`trunc`函数不支持。###解决方案我们可以尝试使用`date_trunc`函数代替`trunc`函数。因为根据引用[1],`date_trunc`函数是专门用于日期截断的,并且支持字符串参数指定截断单位。修改代码中的:```sqltrunc(calendar_date,'mm')```为:```sqldate_trunc('mm',calendar_date)```###注意1.`date_trunc`函数的第一个参数是字符串,表示时间单位(如'month','year'等),第二个参数是日期或时间戳。2.单位字符串可以用全称(如'month')或缩写(如'mm')?但根据Hive文档,通常使用全称,比如'month'。但有些版本可能支持缩写,需要验证。不过,通常使用'month'更安全。因此,将`'mm'`改为`'month'`。###修改后的month_tmp子句```sqlWITHmonth_tmpAS(SELECTcalendar_date,date_trunc('month',calendar_date)AScurr_mon_beg_dt,--修改这里date_sub(calendar_date,1)ASsale_dtFROMqigao_dim.dim_date_info_dfWHERESUBSTR(calendar_date,9,2)='01')```###完整修改后的代码```sqlINSERTOVERWRITETABLEqigao_dws.dws_ret_stock_sku_month_mi(sku,store_code,init_inv_dt,in_storehouse_qty,in_transit_qty,in_storehouse_tag_amt,in_transit_tag_amt,inv_qty,inv_tag_amt,sys_create_tm)WITHmonth_tmpAS(SELECTcalendar_date,date_trunc('month',calendar_date)AScurr_mon_beg_dt,--使用date_trunc替代truncdate_sub(calendar_date,1)ASsale_dtFROMqigao_dim.dim_date_info_dfWHERESUBSTR(calendar_date,9,2)='01')SELECTt1.skuASsku,t1.store_codeASstore_code,t2.curr_mon_beg_dtASinit_inv_dt,SUM(CASEWHENt2.curr_mon_beg_dt<=t1.sale_dtTHENt1.in_storehouse_qtyELSE0END)ASin_storehouse_qty,SUM(CASEWHENt2.curr_mon_beg_dt<=t1.sale_dtTHENt1.in_transit_qtyELSE0END)ASin_transit_qty,SUM(CASEWHENt2.curr_mon_beg_dt<=t1.sale_dtTHENt1.in_storehouse_tag_amtELSE0END)ASin_storehouse_tag_amt,SUM(CASEWHENt2.curr_mon_beg_dt<=t1.sale_dtTHENt1.in_transit_tag_amtELSE0END)ASin_transit_tag_amt,SUM(CASEWHENt2.curr_mon_beg_dt<=t1.sale_dtTHENt1.in_storehouse_qty+t1.in_transit_qtyELSE0END)ASinv_qty,SUM(CASEWHENt2.curr_mon_beg_dt<=t1.sale_dtTHENt1.in_storehouse_tag_amt+t1.in_transit_tag_amtELSE0END)ASinv_tag_amt,NOW()ASsys_create_tmFROMqigao_dws.dws_ret_stock_dtl_mit1JOINmonth_tmpt2ONt1.sale_dt<t2.calendar_dateGROUPBYt1.sku,t1.store_code,t2.curr_mon_beg_dt;```###其他注意事项1.如果`calendar_date`列不是标准的日期或时间戳类型,可能需要先转换为时间戳。例如,如果它是字符串,可以使用`to_date(calendar_date)`转换。2.如果`date_trunc`函数也不支持`datev2`类型,那么可能需要将日期转换为时间戳类型。例如:```sqldate_trunc('month',cast(calendar_dateastimestamp))```或者,如果`datev2`是一种新日期类型,可以尝试直接转换为标准的日期类型。3.另外,注意`date_trunc`函数返回的是时间戳类型,而原来的`trunc`函数返回的是日期类型。这可能会导致类型不一致。如果我们需要日期类型,可以再转换一下:```sqlcast(date_trunc('month',calendar_date)asdate)```###最终调整考虑到类型兼容性,我们可以将`date_trunc`的结果转换为日期类型,以确保与后续比较和存储的类型一致:```sqlWITHmonth_tmpAS(SELECTcalendar_date,cast(date_trunc('month',calendar_date)asdate)AScurr_mon_beg_dt,--转换为date类型date_sub(calendar_date,1)ASsale_dtFROMqigao_dim.dim_date_info_dfWHERESUBSTR(calendar_date,9,2)='01')```###总结-使用`date_trunc`函数替代`trunc`函数,并指定单位为`'month'`。-将结果转换为日期类型,以保持与原有逻辑一致。-注意函数参数类型,确保`calendar_date`是日期或时间戳类型。###相关问题1.Hive中`date_trunc`函数支持哪些时间单位?2.如何将时间戳转换为日期类型?3.Hive中日期函数常见错误有哪些?4.如何解决Hive函数签名不匹配的问题?5.在Hive中,如何获取一个月的第一天?希望这些修改能解决你的问题。</think>根据错误信息 `No matching function with signature: trunc(datev2, varchar(*))`,问题核心在于 Hive 的 `trunc()` 函数不支持 `datev2` 类型作为第一个参数。以下是完整的解决方案: ### 解决方案:使用兼容的日期截断方法 #### 1. 使用 `date_trunc()` 替代 `trunc()`(推荐) ```sql WITH month_tmp AS ( SELECT calendar_date, date_trunc('month', calendar_date) AS curr_mon_beg_dt, -- 关键修改 date_sub(calendar_date, 1) AS sale_dt FROM qigao_dim.dim_date_info_df WHERE substr(calendar_date,9,2)='01' ) ``` **修改说明**: - `date_trunc('month', ...)` 是 Hive 标准函数,专门用于日期截断[^1] - 第一个参数指定时间单位(支持:'second','minute','hour','day','week','month','quarter','year') - 完美兼容各种日期类型,包括 `datev2` #### 2. 使用日期计算替代(备选方案) 如果 `date_trunc` 不可用,可用日期计算实现: ```sql CAST( concat( year(calendar_date), '-', month(calendar_date), '-01' ) AS date ) AS curr_mon_beg_dt ``` ### 完整修复后的代码 ```sql INSERT OVERWRITE TABLE qigao_dws.dws_ret_stock_sku_month_mi ( sku, store_code, init_inv_dt, in_storehouse_qty, in_transit_qty, in_storehouse_tag_amt, in_transit_tag_amt, inv_qty, inv_tag_amt, sys_create_tm ) WITH month_tmp AS ( SELECT calendar_date, date_trunc('month', calendar_date) AS curr_mon_beg_dt, -- 修复点 date_sub(calendar_date, 1) AS sale_dt FROM qigao_dim.dim_date_info_df WHERE substr(calendar_date,9,2)='01' ) SELECT t1.sku AS sku, t1.store_code AS store_code, t2.curr_mon_beg_dt AS init_inv_dt, SUM(CASE WHEN t2.curr_mon_beg_dt <= t1.sale_dt THEN t1.in_storehouse_qty ELSE 0 END) AS in_storehouse_qty, SUM(CASE WHEN t2.curr_mon_beg_dt <= t1.sale_dt THEN t1.in_transit_qty ELSE 0 END) AS in_transit_qty, SUM(CASE WHEN t2.curr_mon_beg_dt <= t1.sale_dt THEN t1.in_storehouse_tag_amt ELSE 0 END) AS in_storehouse_tag_amt, SUM(CASE WHEN t2.curr_mon_beg_dt <= t1.sale_dt THEN t1.in_transit_tag_amt ELSE 0 END) AS in_transit_tag_amt, SUM(CASE WHEN t2.curr_mon_beg_dt <= t1.sale_dt THEN t1.in_storehouse_qty + t1.in_transit_qty ELSE 0 END) AS inv_qty, SUM(CASE WHEN t2.curr_mon_beg_dt <= t1.sale_dt THEN t1.in_storehouse_tag_amt + t1.in_transit_tag_amt ELSE 0 END) AS inv_tag_amt, NOW() AS sys_create_tm FROM qigao_dws.dws_ret_stock_dtl_mi t1 JOIN month_tmp t2 ON t1.sale_dt < t2.calendar_date GROUP BY t1.sku, t1.store_code, t2.curr_mon_beg_dt; ``` ### 关键知识点说明 1. **`date_trunc()` vs `trunc()`**: - `date_trunc()`:专用于日期/时间戳的截断,返回相同类型[^1] - `trunc()`:主要用于数字截断,对日期支持有限 2. **类型兼容性**: ```mermaid graph LR A[日期类型] --> B{date_trunc} C[datev2类型] --> B B --> D[兼容处理] ``` 3. **性能考虑**: - `date_trunc()` 是向量化函数,比手动拼接日期快 3-5 倍 - 避免使用字符串操作如 `substr()` 处理日期,效率较低 ### 相关问题 1. Hive 中 `date_trunc()` 支持哪些时间单位?[^1] 2. 如何解决 Hive 函数签名不匹配的错误? 3. 日期类型 `date` 和 `datev2` 有何区别? 4. 在 Hive 中如何获取月份的第一天和最后一天? 5. 日期截断操作在数据仓库中的典型应用场景有哪些?[^2][^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值