【翻譯】Flink Table Api & SQL — 內置函數


本文翻譯自官網:Built-In Functions  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/functions.html

Flink Table Api & SQL 翻譯目錄

Flink Table API和SQL為用戶提供了一組用於數據轉換的內置函數。此頁面簡要概述了它們。如果尚不支持所需的功能,則可以實現用戶定義的功能如果您認為該功能足夠通用,請為此打開Jira問題,並提供詳細說明。

標量函數

標量函數將零個,一個或多個值作為輸入,並返回一個值作為結果。

比較功能

比較功能 描述
ANY1 === ANY2

如果ANY1等於ANY2 返回true; 如果ANY1ANY2為NULL,則返回UNKNOWN 

ANY1 !== ANY2

如果ANY1不等於ANY2 返回true; 如果ANY1ANY2為NULL,則返回UNKNOWN 

ANY1 > ANY2

如果 ANY1大於ANY2 返回TRUE; 如果ANY1ANY2為NULL,則返回UNKNOWN 

ANY1 >= ANY2

如果 ANY1大於或等於ANY2返回TRUE ; 如果ANY1ANY2為NULL,則返回UNKNOWN 

ANY1 < ANY2

如果 ANY1小於ANY2返回TRUE ; 如果ANY1ANY2為NULL,則返回UNKNOWN 

ANY1 <= ANY2

如果ANY1小於或等於ANY2 返回TRUE; 如果ANY1ANY2為NULL,則返回UNKNOWN 

ANY.isNull

如果ANY為NULL,則返回TRUE 

ANY.isNotNull

如果ANY不為NULL,則返回TRUE 

STRING1.like(STRING2)

如果STRING1匹配模式STRING2則返回TRUE 如果STRING1STRING2為NULL,則返回UNKNOWN 

例如,"JoKn".like("Jo_n%")返回TRUE。

STRING1.similar(STRING2)

如果STRING1與SQL正則表達式STRING2匹配,則返回TRUE 如果STRING1STRING2為NULL,則返回UNKNOWN 

例如,"A".similar("A+")返回TRUE。

ANY1.in(ANY2, ANY3, ...)

如果ANY1存在於給定列表(ANY2,ANY3,...)中,則返回TRUE 

(ANY2,ANY3,...)包含NULL,如果可以找到該元素,則返回TRUE,否則返回UNKNOWN。

如果ANY1為NULL,則始終返回UNKNOWN 。

例如,4.in(1, 2, 3)返回FALSE。

ANY.in(TABLE)

如果ANY等於子查詢TABLE返回的行,則返回TRUE 

注意:對於流查詢,該操作將在聯接和分組操作中重寫。

根據不同輸入行的數量,計算查詢結果所需的狀態可能會無限增長。

請提供具有有效保留間隔的查詢配置,以防止出現過多的狀態。有關詳細信息,請參見查詢配置

ANY1.between(ANY2, ANY3)

如果ANY1大於或等於ANY2和小於或等於ANY3 返回trueANY2ANY3為NULL時,返回FALSE或UNKNOWN。

例如,12.between(15, 12)返回FALSE; 12.between(10, Null(Types.INT))返回UNKNOWN; 12.between(Null(Types.INT), 10)返回FALSE。

ANY1.notBetween(ANY2, ANY3)

如果ANY1小於ANY2或大於ANY3 返回trueANY2ANY3為NULL時,返回TRUE或UNKNOWN。

例如,12.notBetween(15, 12)返回TRUE;12.notBetween(Null(Types.INT), 15)返回UNKNOWN;12.notBetween(15, Null(Types.INT))返回TRUE。

邏輯函數

邏輯功能 描述
BOOLEAN1 || BOOLEAN2

如果BOOLEAN1為TRUE或BOOLEAN2為TRUE,返回TRUE。支持三值邏輯。

例如,true || Null(Types.BOOLEAN)返回TRUE。

BOOLEAN1 && BOOLEAN2

如果BOOLEAN1BOOLEAN2均為TRUE,則返回TRUE。支持三值邏輯。

例如,true && Null(Types.BOOLEAN)返回未知。

!BOOLEAN

如果BOOLEAN為FALSE,則返回TRUE 如果BOOLEAN為TRUE,則返回FALSE 

如果BOOLEAN為UNKNOWN,則返回UNKNOWN。

BOOLEAN.isTrue

如果BOOLEAN為TRUE,則返回TRUE;如果BOOLEAN為FALSE或UNKNOWN,則返回FALSE 

BOOLEAN.isFalse

如果BOOLEAN為FALSE,則返回TRUE 如果BOOLEAN為TRUE或UNKNOWN,則返回FALSE 

BOOLEAN.isNotTrue

如果BOOLEAN為FALSE或UNKNOWN,則返回TRUE 如果BOOLEAN為TRUE,則返回FALSE 

BOOLEAN.isNotFalse

如果BOOLEAN為TRUE或UNKNOWN,則返回TRUE 如果BOOLEAN為FALSE,則返回FALSE。

算術函數

算術函數 描述
+ NUMERIC

返回NUMERIC

- NUMERIC

返回負數NUMERIC

NUMERIC1 + NUMERIC2

返回NUMERIC1NUMERIC2

NUMERIC1 - NUMERIC2

返回NUMERIC1減去NUMERIC2

NUMERIC1 * NUMERIC2

返回NUMERIC1乘以NUMERIC2

NUMERIC1 / NUMERIC2

返回NUMERIC1除以NUMERIC2

NUMERIC1.power(NUMERIC2)

返回NUMERIC1NUMERIC2 次冪

NUMERIC.abs()

返回NUMERIC的絕對值

NUMERIC1 % NUMERIC2

返回NUMERIC1除以NUMERIC2的余數(模)僅當numeric1為負數時,結果為負數。

NUMERIC.sqrt()

返回NUMERIC的平方根

NUMERIC.ln()

返回NUMERIC的自然對數(以e為底)

NUMERIC.log10()

返回NUMERIC的以10為底的對數

NUMERIC.log2()

返回NUMERIC的以2為底的對數

NUMERIC1.log() NUMERIC1.log(NUMERIC2)

如果不帶參數調用,則返回NUMERIC1的自然對數當使用參數調用時,將NUMERIC1的對數返回到基數NUMERIC2

注意:當前,NUMERIC1必須大於0,而NUMERIC2必須大於1。

NUMERIC.exp()

返回e 的 NUMERIC 次

NUMERIC.ceil()

NUMERIC向上舍入,並返回大於或等於NUMERIC的最小整數

NUMERIC.floor()

向下舍入NUMERIC,並返回小於或等於NUMERIC的最大整數

NUMERIC.sin()

返回NUMERIC的正弦值

NUMERIC.sinh()

返回NUMERIC的雙曲正弦值

返回類型為DOUBLE

NUMERIC.cos()

返回NUMERIC的余弦值

NUMERIC.tan()

返回NUMERIC的正切

NUMERIC.tanh()

返回NUMERIC的雙曲正切值

返回類型為DOUBLE

NUMERIC.cot()

返回NUMERIC的余切

NUMERIC.asin()

返回NUMERIC的反正弦值

NUMERIC.acos()

返回NUMERIC的反余弦值

NUMERIC.atan()

返回NUMERIC的反正切

atan2(NUMERIC1, NUMERIC2)

返回坐標的反正切(NUMERIC1,NUMERIC2)

NUMERIC.cosh()

返回NUMERIC的雙曲余弦值

返回值類型為DOUBLE

NUMERIC.degrees()

返回弧度NUMERIC的度數表示形式

NUMERIC.radians()

返回度數NUMERIC的弧度表示

NUMERIC.sign()

返回NUMERIC的符號

NUMERIC.round(INT)

返回一個數字,四舍五入NUMERIC的INT小數位

pi()

返回一個比pi更接近其他值的值。

e()

返回一個比任何其他值都更接近e的值。

rand()

返回介於0.0(含)和1.0(不含)之間的偽隨機雙精度值。

rand(INTEGER)

返回帶有初始種子INTEGER的介於0.0(含)和1.0(不含)之間的偽隨機雙精度值

如果兩個RAND函數具有相同的初始種子,它們將返回相同的數字序列。

randInteger(INTEGER)

返回介於0(含)和INTEGER(不含)之間的偽隨機整數值

randInteger(INTEGER1, INTEGER2)

返回介於0(含)和INTEGER2不含)之間的偽隨機整數值,其初始種子為INTEGER1

如果兩個randInteger函數具有相同的初始種子和邊界,它們將返回相同的數字序列。

uuid()

根據RFC 4122 type 4(偽隨機生成)UUID返回UUID(通用唯一標識符)字符串

(例如,“ 3d3c68f7-f608-473f-b60c-b0c44ad4cc4e”)。使用加密強度高的偽隨機數生成器生成UUID。

INTEGER.bin()

以二進制格式返回INTEGER的字符串表示形式。如果INTEGER為NULL,則返回NULL。

例如,4.bin()返回“ 100”並12.bin()返回“ 1100”。

NUMERIC.hex() STRING.hex()

以十六進制格式返回整數NUMERIC值或STRING的字符串表示形式。如果參數為NULL,則返回NULL。

例如,數字20導致“ 14”,數字100導致“ 64”,字符串“ hello,world”導致“ 68656C6C6F2C776F726C64”。

字符串函數

字符串函數 描述
STRING1 + STRING2

返回STRING1STRING2的串聯

STRING.charLength()

返回STRING中的字符數

STRING.upperCase()

以大寫形式返回STRING

STRING.lowerCase()

以小寫形式返回STRING

STRING1.position(STRING2)

返回STRING1STRING2中第一次出現的位置(從1開始)

如果STRING2中找不到STRING1,返回0 

STRING.trim( leading = true, trailing = true, character = " ")

返回一個字符串,該字符串從STRING中刪除前導和/或結尾字符

STRING.ltrim()

返回一個字符串,該字符串從STRING除去左空格

例如," This is a test String.".ltrim()返回“This is a test String.”。

STRING.rtrim()

返回一個字符串,該字符串從STRING中刪除正確的空格

例如,"This is a test String. ".rtrim()返回“This is a test String.”。

STRING.repeat(INT)

返回一個字符串,該字符串重復基本STRING INT次。

例如,"This is a test String.".repeat(2)返回“This is a test String.This is a test String.”。

STRING1.regexpReplace(STRING2, STRING3)

返回字符串STRING1所有匹配正則表達式的子串STRING2連續被替換STRING3

例如,"foobar".regexpReplace("oo|ar", "")返回“ fb”。

STRING1.overlay(STRING2, INT1) STRING1.overlay(STRING2, INT1, INT2)

從位置INT1返回一個字符串,該字符串將STRING1INT2默認為STRING2的長度)字符替換STRING2

例如,"xxxxxtest".overlay("xxxx", 6)返回“ xxxxxxxxx”;"xxxxxtest".overlay("xxxx", 6, 2)返回“ xxxxxxxxxst”。

STRING.substring(INT1) STRING.substring(INT1, INT2)

返回字符串STRING的子字符串,從位置INT1開始,長度為INT2(默認為結尾)。

STRING1.replace(STRING2, STRING3)

返回一個新字符串替換其中出現的所有STRING2STRING3(非重疊)從STRING1

例如,"hello world".replace("world", "flink")返回“ hello flink”;"ababab".replace("abab", "z")返回“ zab”。

STRING1.regexpExtract(STRING2[, INTEGER1])

STRING1返回一個字符串,字符串使用指定的正則表達式STRING2和正則表達式匹配組索引INTEGER1提取

注意: regex匹配組索引從1和0開始,表示匹配整個regex。另外,正則表達式匹配組索引不應超過定義的組數。

例如,"foothebar".regexpExtract("foo(.*?)(bar)", 2)"返回“ bar”。

STRING.initCap()

返回一種新形式的STRING,其中每個單詞的第一個字符轉換為大寫,其余字符轉換為小寫。

這里的單詞表示字母數字字符序列。

concat(STRING1, STRING2, ...)

返回連接STRING1,STRING2,...的字符串如果任何參數為NULL,則返回NULL。

例如,concat("AA", "BB", "CC")返回“ AABBCC”。

concat_ws(STRING1, STRING2, STRING3, ...)

返回一個字符串,會連接STRING2,STRING3,......與分離STRING1

分隔符被添加到要連接的字符串之間。如果STRING1為NULL,則返回NULL。

與相比concat(),會concat_ws()自動跳過NULL參數。

例如,concat_ws("~", "AA", Null(Types.STRING), "BB", "", "CC")返回“ AA〜BB ~~ CC”。

STRING1.lpad(INT, STRING2)

返回一個新字符串,該字符串從STRING1的左側填充STRING2,長度為INT個字符。

如果STRING1的長度小於INT,則返回縮短為INT個字符的STRING1

例如,"hi".lpad(4, "??")返回“ ?? hi”; "hi".lpad(1, "??")返回“ h”。

STRING1.rpad(INT, STRING2)

返回一個新字符串,該字符串從STRING1右側填充STRING2,長度為INT個字符。

如果STRING1的長度小於INT,則返回縮短為INT個字符的STRING1

例如,"hi".rpad(4, "??")返回“ hi ??”; "hi".rpad(1, "??")返回“ h”。

STRING.fromBase64()

返回來自STRING的base64解碼結果如果STRING為NULL,則返回null 

例如,"aGVsbG8gd29ybGQ=".fromBase64()返回“ hello world”。

STRING.toBase64()

STRING返回base64編碼的結果如果STRING為NULL,則返回NULL。

例如,"hello world".toBase64()返回“ aGVsbG8gd29ybGQ =“。

時間函數

時間功能 描述
STRING.toDate

返回以“ yyyy-MM-dd”形式STRING解析的SQL日期

STRING.toTime

返回以“ HH:mm:ss”的形式STRING解析的SQL時間

STRING.toTimestamp

返回從STRING解析的SQL時間戳,格式為“ yyyy-MM-dd HH:mm:ss [.SSS]”。

NUMERIC.year NUMERIC.years

NUMERIC創建一個月間隔

NUMERIC.quarter NUMERIC.quarters

NUMERIC個季度創建一個月間隔

例如,2.quarters傳回6。

NUMERIC.month NUMERIC.months

創建間隔NUMERIC個月。

NUMERIC.week NUMERIC.weeks

創建NUMERIC的毫秒間隔

例如,2.weeks傳回1209600000。

NUMERIC.day NUMERIC.days

創建NUMERIC的毫秒間隔

NUMERIC.hour NUMERIC.hours

創建NUMERIC小時的毫秒間隔

NUMERIC.minute NUMERIC.minutes

NUMERIC分鍾創建一個毫秒間隔

NUMERIC.second NUMERIC.seconds

NUMERIC創建毫秒間隔

NUMERIC.milli NUMERIC.millis

創建一個NUMERIC毫秒的時間間隔

currentDate()

返回UTC時區中的當前SQL日期。

currentTime()

返回UTC時區中的當前SQL時間。

currentTimestamp()

返回UTC時區中的當前SQL時間戳。

localTime()

返回本地時區的當前SQL時間。

localTimestamp()

返回本地時區的當前SQL時間戳。

TEMPORAL.extract(TIMEINTERVALUNIT)

返回從temporalTIMEINTERVALUNIT部分中提取的長值

例如,"2006-06-05".toDate.extract(TimeIntervalUnit.DAY)返回5;

"2006-06-05".toDate.extract(QUARTER)返回2。

TIMEPOINT.floor(TIMEINTERVALUNIT)

返回將TIMEPOINT向下入為時間單位TIMEINTERVALUNIT的值

例如,"12:44:31".toDate.floor(TimeIntervalUnit.MINUTE)返回12:44:00。

TIMEPOINT.ceil(TIMEINTERVALUNIT)

返回將TIMEPOINT 入為時間單位TIMEINTERVALUNIT的值

例如,"12:44:31".toTime.floor(TimeIntervalUnit.MINUTE)返回12:45:00。

temporalOverlaps(TIMEPOINT1, TEMPORAL1, TIMEPOINT2, TEMPORAL2)

如果(TIMEPOINT1TEMPORAL1)和(TIMEPOINT2TEMPORAL2定義的兩個時間間隔重疊則返回TRUE 

時間值可以是時間點,也可以是時間間隔。

例如,temporalOverlaps("2:55:00".toTime, 1.hour, "3:30:00".toTime, 2.hour)返回TRUE。

dateFormat(TIMESTAMP, STRING)

注意此功能存在嚴重的錯誤,暫時不應使用。請改為實施自定義UDF或使用extract()作為解決方法。

timestampDiff(TIMEPOINTUNIT, TIMEPOINT1, TIMEPOINT2)

返回TIMEPOINT1和TIMEPOINT2之間的TIMEPOINTUNIT的(帶符號)編號。 時間間隔的單位由第一個參數指定,該參數應為以下值之一:SECOND,MINUTE,HOUR,DAY,MONTH或YEAR。

另請參見時間間隔和點單位說明符表。

例如,timestampDiff(TimePointUnit.DAY,'2003-01-02 10:00:00'.toTimestamp,'2003-01-03 10:00:00'.toTimestamp)返回1。

條件函數

條件函數 描述
BOOLEAN.?(VALUE1, VALUE2)

如果BOOLEAN的計算結果為TRUE,返回VALUE1;否則,返回VALUE1否則返回VALUE2

例如,(42 > 5).?("A", "B")返回“ A”。

類型轉換函數功能

類型轉換函數 描述
ANY.cast(TYPE)

返回轉換為TYPE類型的新ANY請在此處查看受支持的類型

例如,"42".cast(Types.INT)返回42;Null(Types.STRING)返回STRING類型的NULL。

Collection 函數功能

Collection 函數 描述
ARRAY.cardinality()

返回ARRAY中的元素數量

ARRAY.at(INT)

返回位於元素INTARRAY索引從1開始。

ARRAY.element()

返回ARRAY的唯一元素(其基數應為1);否則false

如果ARRAY為空,則返回NULL 如果ARRAY具有多個元素,則引發異常

MAP.cardinality()

返回MAP中的條目數

MAP.at(ANY)

返回鍵指定的值ANYMAP

Value Construction構函數

Value Construction函數

描述
row(ANY1, ANY2, ...)

返回從對象值(ANY1,ANY2,...)的列表創建的行行是復合類型,可以通過值訪問函數進行訪問

array(ANY1, ANY2, ...)

返回從對象值(ANY1,ANY2,...)的列表創建的數組

map(ANY1, ANY2, ANY3, ANY4, ...)

返回從鍵值對列表((ANY1,ANY2),(ANY3,ANY4),...)創建的映射

NUMERIC.rows

創建NUMERIC間隔(通常在窗口創建中使用)。

Value Access函數

Value Access函數

描述
COMPOSITE.get(STRING) COMPOSITE.get(INT)

通過名稱或索引從Flink復合類型(例如,Tuple,POJO)返回字段的值。

例如,'pojo.get("myField")'tuple.get(0)

ANY.flatten()

返回Flink復合類型(例如Tuple,POJO)的平面表示形式,該類型將其每個直接子類型轉換為單獨的字段。

在大多數情況下,平面表示形式的字段與原始字段的命名方式相似,但帶有美元分隔符(例如,mypojo $ mytuple $ f0)。

分組函數

分組函數 描述
GROUP_ID()

返回一個唯一標識分組鍵組合的整數。

GROUPING(expression1 [, expression2]* )
GROUPING_ID(expression1 [, expression2]* )

返回給定分組表達式的位向量。

hash函數

hash函數 描述
STRING.md5()

以32個十六進制數字的字符串形式返回STRING的MD5哈希值如果STRING為NULL,則返回NULL。

STRING.sha1()

以40個十六進制數字的字符串形式返回STRING的SHA-1哈希值如果STRING為NULL,則返回NULL。

STRING.sha224()

以56個十六進制數字的字符串形式返回STRING的SHA-224哈希值如果STRING為NULL,則返回NULL。

STRING.sha256()

以64個十六進制數字的字符串形式返回STRING的SHA-256哈希值如果STRING為NULL,則返回NULL。

STRING.sha384()

以96個十六進制數字的字符串返回STRING的SHA-384哈希值如果STRING為NULL,則返回NULL。

STRING.sha512()

以128個十六進制數字的字符串返回STRING的SHA-512哈希值如果STRING為NULL,則返回NULL。

STRING.sha2(INT)

返回由INT(可能為224、256、384或512)為STRING指定的SHA-2系列

(SHA-224,SHA-256,SHA-384或SHA-512)哈希值如果STRINGINT為NULL,則返回NULL。

輔助函數

輔助函數 描述
ANY.as(NAME1, NAME2, ...)

指定ANY的名稱(字段)。如果表達式擴展到多個字段,則可以指定其他名稱。

匯總函數

聚合函數將所有行中的表達式作為輸入,並返回單個聚合值作為結果。

匯總功能 描述
FIELD.count

返回FIELD不為NULL 的輸入行數

FIELD.avg

返回所有輸入行FIELD的平均值(算術平均值)

FIELD.sum

返回所有輸入行中數字字段FIELD的總和如果所有值均為NULL,則返回NULL。

FIELD.sum0

返回所有輸入行中數字字段FIELD的總和如果所有值均為NULL,則返回0。

FIELD.max

返回所有輸入行中數字字段FIELD的最大值

FIELD.min

返回所有輸入行中數字字段FIELD的最小值

FIELD.stddevPop

返回所有輸入行中數字字段FIELD的總體標准偏差

FIELD.stddevSamp

返回所有輸入行中數字字段FIELD的樣本標准偏差

FIELD.varPop

返回所有輸入行中數字字段FIELD的總體方差(總體標准差的平方)

FIELD.varSamp

返回所有輸入行中數字字段FIELD的樣本方差(樣本標准差的平方)

FIELD.collect

返回所有輸入行FIELD的多集

時間間隔和點單位說明符

下表列出了時間間隔和時間單位的說明符。

對於Table API,請使用_空格(例如DAY_TO_HOUR)。

 

時間間隔單位 時間點單位
MILLENIUM (僅SQL)  
CENTURY (僅SQL)  
YEAR YEAR
YEAR TO MONTH  
QUARTER QUARTER
MONTH MONTH
WEEK WEEK
DAY DAY
DAY TO HOUR  
DAY TO MINUTE  
DAY TO SECOND  
HOUR HOUR
HOUR TO MINUTE  
HOUR TO SECOND  
MINUTE MINUTE
MINUTE TO SECOND  
SECOND SECOND
  MILLISECOND
  MICROSECOND
DOY (僅SQL)  
DOW (僅SQL)  
  SQL_TSI_YEAR (僅SQL)
  SQL_TSI_QUARTER (僅SQL)
  SQL_TSI_MONTH (僅SQL)
  SQL_TSI_WEEK (僅SQL)
  SQL_TSI_DAY (僅SQL)
  SQL_TSI_HOUR (僅SQL)
  SQL_TSI_MINUTE (僅SQL)
  SQL_TSI_SECOND (僅SQL)

列函數

列函數用於選擇或刪除列.

SYNTAX DESC
withColumns(…) 選擇的列
withoutColumns(…) 不選擇的列

詳細語法如下:

columnFunction:
    withColumns(columnExprs)
    withoutColumns(columnExprs)

columnExprs:
    columnExpr [, columnExpr]*

columnExpr:
    columnRef | columnIndex to columnIndex | columnName to columnName

columnRef:
    columnName(The field name that exists in the table) | columnIndex(a positive integer starting from 1)

下表說明了column函數的用法。(假設我們有一個包含5列的表)(a: Int, b: Long, c: String, d:String, e: String)

api 用法 描述
withColumns(*)| *
select(withColumns('*)) | select('*) = select('a, 'b, 'c, 'd, 'e)
所有列
withColumns(m至n)
select(withColumns(2 to 4)) = select('b, 'c, 'd)
從m到n的列
withColumns(m,n,k)
select(withColumns(1, 3, 'e)) = select('a, 'c, 'e)
m,n,k列
withColumns(m,n to k)
select(withColumns(1, 3 to 5)) = select('a, 'c, 'd, 'e)
上面兩種表示的混合
withoutColumns(m to n)
select(withoutColumns(2 to 4)) = select('a, 'e)
取消選擇從m到n的列
withoutColumns(m,n,k)
select(withoutColumns(1, 3, 5)) = select('b, 'd)
取消選擇列m,n,k
withoutColumns(m,n to k)
select(withoutColumns(1, 3 to 5)) = select('b)
上面兩種表示的混合

列函數可以在所有需要列字段的地方使用,select, groupBy, orderBy, UDFs 等.例如:

table
   .groupBy(withColumns(1 to 3))
   .select(withColumns('a to 'b), myUDAgg(myUDF(withColumns(5 to 20))))

注意:列函數僅在Table API中使用。 

歡迎關注Flink菜鳥公眾號,會不定期更新Flink(開發技術)相關的推文

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM