溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

(第7篇)靈活易用易維護(hù)的hadoop數(shù)據(jù)倉庫工具——Hive

發(fā)布時(shí)間:2020-08-14 11:20:37 來源:網(wǎng)絡(luò) 閱讀:1124 作者:I加加 欄目:數(shù)據(jù)庫

   Hive

hive是基于Hadoop的一個(gè)數(shù)據(jù)倉庫工具,可以將結(jié)構(gòu)化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,并提供完整的sql查詢功能,Hive 定義了簡單的類 SQL 查詢語言,稱為 HQL,它允許熟悉 SQL 的用戶查詢數(shù)據(jù)可以將 sql語句轉(zhuǎn)換為MapReduce任務(wù)進(jìn)行運(yùn)行,不必開發(fā)專門的MapReduce。畢竟會(huì)寫SQL的人比寫JAVA的人多,這樣可以讓一大批運(yùn)營人員直接獲取海量數(shù)據(jù)。在數(shù)據(jù)倉庫建設(shè)中,HIVE靈活易用且易于維護(hù),十分適合數(shù)據(jù)倉庫的統(tǒng)計(jì)分析。

本章內(nèi)容:

1) Hive簡介

2) Hive基礎(chǔ)組成

3) Hive執(zhí)行流程

4) Hive基礎(chǔ)操作

1. Hive基礎(chǔ)原理

hive是建設(shè)在Hadoop之上,Hive包括如下組件:CLI(command line interface)、JDBC/ODBC、Thrift Server、WEB GUI、MetaStoreDriver(Complier、Optimizer和Executor)。

(第7篇)靈活易用易維護(hù)的hadoop數(shù)據(jù)倉庫工具——Hive 

1) Driver組件:包括Complier、Optimizer和Executor,它的作用是將我們寫的HiveQL(類SQL)語句進(jìn)行解析、編譯優(yōu)化,生成執(zhí)行計(jì)劃,然后調(diào)用底層的MapReduce計(jì)算框架。

2) Metastore組件:元數(shù)據(jù)服務(wù)組件存儲(chǔ)hive的元數(shù)據(jù),hive的元數(shù)據(jù)存儲(chǔ)在關(guān)系數(shù)據(jù)庫里,hive支持的關(guān)系數(shù)據(jù)庫有derby、mysql。Hive還支持把metastore服務(wù)安裝到遠(yuǎn)程的服務(wù)器集群里,從而解耦hive服務(wù)和metastore服務(wù)。

3) Thrift服務(wù):thrift是facebook開發(fā)的一個(gè)軟件框架,它用來進(jìn)行可擴(kuò)展且跨語言的服務(wù)的開發(fā),hive集成了該服務(wù),能讓不同的編程語言調(diào)用hive的接口。

4) CLI:command line interface,命令行接口。

5) Thrift客戶端: hive架構(gòu)的許多客戶端接口是建立在thrift客戶端之上,包括JDBC和ODBC接口。

6) WEBGUI:hive客戶端提供了一種通過網(wǎng)頁的方式訪問hive所提供的服務(wù)。

用戶接口主要有三個(gè):CLI,Client  WUI。其中最常用的是CLI,公司內(nèi)可通過堡壘機(jī)連接ssh hdp_lbg_ectech@10.126.101.7,直接輸入hive,就可連接到HiveServer。

Hive的metastore組件是hive元數(shù)據(jù)集中存放地。Metastore組件包括兩個(gè)部分:metastore服務(wù)和后臺(tái)數(shù)據(jù)的存儲(chǔ)。后臺(tái)數(shù)據(jù)存儲(chǔ)的介質(zhì)就是關(guān)系數(shù)據(jù)庫,例如hive默認(rèn)的嵌入式磁盤數(shù)據(jù)庫derby,還有mysql數(shù)據(jù)庫。Metastore服務(wù)是建立在后臺(tái)數(shù)據(jù)存儲(chǔ)介質(zhì)之上,并且可以和hive服務(wù)進(jìn)行交互的服務(wù)組件,默認(rèn)情況下,metastore服務(wù)和hive服務(wù)是安裝在一起的,運(yùn)行在同一個(gè)進(jìn)程當(dāng)中。我也可以把metastore服務(wù)從hive服務(wù)里剝離出來,metastore獨(dú)立安裝在一個(gè)集群里,hive遠(yuǎn)程調(diào)用metastore服務(wù),這樣我們可以把元數(shù)據(jù)這一層放到防火墻之后,客戶端訪問hive服務(wù),就可以連接到元數(shù)據(jù)這一層,從而提供了更好的管理性和安全保障。使用遠(yuǎn)程的metastore服務(wù),可以讓metastore服務(wù)和hive服務(wù)運(yùn)行在不同的進(jìn)程里,這樣也保證了hive的穩(wěn)定性,提升了hive服務(wù)的效率。

對(duì)于數(shù)據(jù)存儲(chǔ),Hive沒有專門的數(shù)據(jù)存儲(chǔ)格式,可以非常自由的組織Hive中的表,只需要在創(chuàng)建表的時(shí)候告訴Hive數(shù)據(jù)中的列分隔符和行分隔符,Hive就可以解析數(shù)據(jù)。Hive中所有的數(shù)據(jù)都存儲(chǔ)在HDFS中,存儲(chǔ)結(jié)構(gòu)主要包括數(shù)據(jù)庫、文件、表和視圖。Hive中包含以下數(shù)據(jù)模型:Table內(nèi)部表,External Table外部表,Partition分區(qū),Bucket桶。Hive默認(rèn)可以直接加載文本文件,還支持sequence file 、RCFile。

Hive的數(shù)據(jù)模型介紹如下:

1) Hive數(shù)據(jù)庫

類似傳統(tǒng)數(shù)據(jù)庫的DataBase,例如 hive >create database test_database;

2) 內(nèi)部表

Hive的內(nèi)部表與數(shù)據(jù)庫中的表在概念上是類似。每一個(gè)Table在Hive中都有一個(gè)相應(yīng)的目錄存儲(chǔ)數(shù)據(jù)。例如一個(gè)表hive_test,它在HDFS中的路徑為/home/hdp_lbg_ectech/warehouse/hdp_lbg_ectech_bdw.db/hive_test,其中/home/hdp_lbg_ectech/warehouse是在hive-site.xml中由${hive.metastore.warehouse.dir}指定的數(shù)據(jù)倉庫的目錄,所有的Table數(shù)據(jù)(不包括外部表)都保存在這個(gè)目錄中。刪除表時(shí),元數(shù)據(jù)與數(shù)據(jù)都會(huì)被刪除。

建表語句示例:

CREATE EXTERNAL TABLE hdp_lbg_ectech_bdw.hive_test

(`userid` string COMMENT'')

ROW FORMAT DELIMITED FIELDS TERMINATED BY'\001';

load data  inpath ‘/home/hdp_lbg_ectech/resultdata/test.txt’overwrite into table hive_test;

3) 外部表

外部表指向已經(jīng)在HDFS中存在的數(shù)據(jù),可以創(chuàng)建分區(qū)。它和內(nèi)部表在元數(shù)據(jù)的組織上是相同的,而實(shí)際數(shù)據(jù)的存儲(chǔ)則有較大的差異。內(nèi)部表在加載數(shù)據(jù)的過程中,實(shí)際數(shù)據(jù)會(huì)被移動(dòng)到數(shù)據(jù)倉庫目錄中。刪除表時(shí),表中的數(shù)據(jù)和元數(shù)據(jù)將會(huì)被同時(shí)刪除。而外部表只有一個(gè)過程,加載數(shù)據(jù)和創(chuàng)建表同時(shí)完成(CREATE EXTERNAL TABLE ……LOCATION),實(shí)際數(shù)據(jù)是存儲(chǔ)在LOCATION后面指定的 HDFS 路徑中,并不會(huì)移動(dòng)到數(shù)據(jù)倉庫目錄中。當(dāng)刪除一個(gè)外部表時(shí),僅刪除該表的元數(shù)據(jù),而實(shí)際外部目錄的數(shù)據(jù)不會(huì)被刪除,推薦使用這種模式。

4) 分區(qū)

Partition相當(dāng)于數(shù)據(jù)庫中的列的索引,但是Hive組織方式和數(shù)據(jù)庫中的很不相同。在Hive中,表中的一個(gè)分區(qū)對(duì)應(yīng)于表下的一個(gè)目錄,所有的分區(qū)數(shù)據(jù)都存儲(chǔ)在對(duì)應(yīng)的目錄中。

一般是按時(shí)間、地區(qū)、類目來分區(qū),便于局部查詢,避免掃描整個(gè)數(shù)據(jù)源。

5) 

Buckets是將表的列通過Hash算法進(jìn)一步分解成不同的文件存儲(chǔ)。它對(duì)指定列計(jì)算hash,根據(jù)hash值切分?jǐn)?shù)據(jù),目的是為了并行,每一個(gè)Bucket對(duì)應(yīng)一個(gè)文件。例如將userid列分散至32個(gè)bucket,首先對(duì)userid列的值計(jì)算hash,對(duì)應(yīng)hash值為0的HDFS目錄為/home/hdp_lbg_ectech/resultdata/part-00000;hash值為20的HDFS目錄為/home/hdp_lbg_ectech/resultdata/part-00020。

6) Hive的視圖

視圖與傳統(tǒng)數(shù)據(jù)庫的視圖類似。目前只有邏輯視圖,沒有物化視圖;視圖只能查詢,不能Load/Insert/Update/Delete數(shù)據(jù);視圖在創(chuàng)建時(shí)候,只是保存了一份元數(shù)據(jù),當(dāng)查詢視圖的時(shí)候,才開始執(zhí)行視圖對(duì)應(yīng)的那些子查詢;

2. Hive基礎(chǔ)操作

1) DDL操作包括

刪除表

修改表結(jié)構(gòu)

創(chuàng)建/刪除視圖

創(chuàng)建數(shù)據(jù)庫和顯示命令

增加分區(qū),刪除分區(qū)

重命名表

修改列的名字、類型、位置、注釋

增加/更新列

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

  [(col_name data_type [COMMENT col_comment], ...)]

  [COMMENT table_comment]

  [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]

  [CLUSTERED BY (col_name, col_name, ...)

  [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]

  [ROW FORMAT row_format]

  [STORED AS file_format]

  [LOCATION hdfs_path]

CREATE TABLE 創(chuàng)建一個(gè)指定名字的表。如果相同名字的表已經(jīng)存在,則拋出異常;用戶可以用 IF NOT EXIST 選項(xiàng)來忽略這個(gè)異常

EXTERNAL 關(guān)鍵字可以讓用戶創(chuàng)建一個(gè)外部表,在建表的同時(shí)指定一個(gè)指向?qū)嶋H數(shù)據(jù)的路徑(LOCATION)

LIKE 允許用戶復(fù)制現(xiàn)有的表結(jié)構(gòu),但是不復(fù)制數(shù)據(jù)

COMMENT可以為表與字段增加描述

ROW FORMAT

DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]

[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]

| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]

用戶在建表的時(shí)候可以自定義 SerDe 或者使用自帶的 SerDe。如果沒有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,將會(huì)使用自帶的 SerDe。在建表的時(shí)候,用戶還需要為表指定列,用戶在指定表的列的同時(shí)也會(huì)指定自定義的 SerDe,Hive 通過 SerDe 確定表的具體的列的數(shù)據(jù)。

STORED AS

SEQUENCEFILE

| TEXTFILE

| RCFILE

| INPUTFORMAT input_format_classname OUTPUTFORMAT             output_format_classname

如果文件數(shù)據(jù)是純文本,可以使用 STORED AS TEXTFILE。如果數(shù)據(jù)需要壓縮,使用 STORED AS SEQUENCE 。

例子1創(chuàng)建簡單表

CREATE TABLE pokes (foo INT, bar STRING);

例子2:創(chuàng)建外部表

CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,

     page_url STRING, referrer_url STRING,

     ip STRING COMMENT 'IP Address of the User',

     country STRING COMMENT 'country of origination')

COMMENT 'This is the staging page view table'

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054'

STORED AS TEXTFILE

LOCATION '<hdfs_location>';

例子3:創(chuàng)建分區(qū)表

CREATE TABLE par_table(viewTime INT, userid BIGINT,

     page_url STRING, referrer_url STRING,

     ip STRING COMMENT 'IP Address of the User')

COMMENT 'This is the page view table'

PARTITIONED BY(date STRING, pos STRING)

ROW FORMAT DELIMITED ‘\t’

FIELDS TERMINATED BY '\n'

STORED AS SEQUENCEFILE;

例子4:創(chuàng)建Bucket表

CREATE TABLE par_table(viewTime INT, userid BIGINT,

     page_url STRING, referrer_url STRING,

     ip STRING COMMENT 'IP Address of the User')

COMMENT 'This is the page view table'

PARTITIONED BY(date STRING, pos STRING)

CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS

ROW FORMAT DELIMITED ‘\t’

FIELDS TERMINATED BY '\n'

STORED AS SEQUENCEFILE;

例子5:創(chuàng)建表并創(chuàng)建索引字段ds

CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);

例子6:復(fù)制一個(gè)空表

CREATE TABLE empty_key_value_store

  LIKE key_value_store;

例子7:顯示所有表

SHOW TABLES;

例子8:按正則條件(正則表達(dá)式)顯示表

SHOW TABLES '.*s';

例子9:添加一列

ALTER TABLE pokes ADD COLUMNS (new_col INT);

例子10:添加一列并增加列字段注釋

ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');

例子11:更改表名

ALTER TABLE events RENAME TO 3koobecaf;

例子12:刪除列

DROP TABLE pokes;

例子13:增加、刪除分區(qū)

增加:

ALTER TABLE table_name ADD [IF NOT EXISTS] partition_spec [ LOCATION 'location1' ] partition_spec [ LOCATION 'location2' ] ...

      partition_spec:

  : PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...)

刪除:

  ALTER TABLE table_name DROP partition_spec, partition_spec,...

例子14:重命名表

ALTER TABLE table_name RENAME TO new_table_name

例子15:修改列的名字、類型、位置、注釋

ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]

這個(gè)命令可以允許改變列名、數(shù)據(jù)類型、注釋、列位置或者它們的任意組合

例子16:創(chuàng)建/刪除視圖

CREATE VIEW [IF NOT EXISTS] view_name [ (column_name [COMMENT column_comment], ...) ][COMMENT view_comment][TBLPROPERTIES (property_name = property_value, ...)] AS SELECT

增加視圖

如果沒有提供表名,視圖列的名字將由定義的SELECT表達(dá)式自動(dòng)生成

如果修改基本表的屬性,視圖中不會(huì)體現(xiàn),無效查詢將會(huì)失敗

視圖是只讀的,不能用LOAD/INSERT/ALTER

 

DROP VIEW view_name

刪除視圖

例子17:創(chuàng)建數(shù)據(jù)庫

CREATE DATABASE name

例子18:顯示命令

show tables;

show databases;

show partitions ;

show functions

describe extended table_name dot col_name

2) DML操作元數(shù)據(jù)存儲(chǔ)

hive不支持用insert語句一條一條的進(jìn)行插入操作,也不支持update操作。數(shù)據(jù)是以load的方式加載到建立好的表中。數(shù)據(jù)一旦導(dǎo)入就不可以修改。

DML包括:

INSERT插入

UPDATE更新

DELETE刪除

向數(shù)據(jù)表內(nèi)加載文件

將查詢結(jié)果插入到Hive表中

LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

 

Load 操作只是單純的復(fù)制/移動(dòng)操作,將數(shù)據(jù)文件移動(dòng)到 Hive 表對(duì)應(yīng)的位置。

filepath

相對(duì)路徑,例如:project/data1

絕對(duì)路徑,例如: /user/hive/project/data1

包含模式的完整 URI,例如:hdfs://namenode:9000/user/hive/project/data1

例子1:向數(shù)據(jù)表內(nèi)加載文件

LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;

例子2:加載本地?cái)?shù)據(jù),同時(shí)給定分區(qū)信息

LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

例子3:加載本地?cái)?shù)據(jù),同時(shí)給定分區(qū)信息

LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

例子4:將查詢結(jié)果插入Hive表

基本模式:

INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement

 

多插入模式:

FROM from_statement

INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1

[INSERT OVERWRITE TABLE tablename2 [PARTITION ...] select_statement2] ...

 

自動(dòng)分區(qū)模式:

INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement

例子3:將查詢結(jié)果寫入HDFS文件系統(tǒng)

INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ... FROM ...

 

FROM from_statement

INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1

[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2]

 

數(shù)據(jù)寫入文件系統(tǒng)時(shí)進(jìn)行文本序列化,且每列用^A 來區(qū)分,\n換行

例子3:INSERT INTO

INSERT INTO  TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement

3) DQL操作數(shù)據(jù)查詢SQL

DQL包括:

基本的Select 操作

基于Partition的查詢

Join

基本Select操作:

SELECT [ALL | DISTINCT] select_expr, select_expr, ...

FROM table_reference

[WHERE where_condition]

[GROUP BY col_list [HAVING condition]]

[   CLUSTER BY col_list

| [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]

]

[LIMIT number]

 

使用ALL和DISTINCT選項(xiàng)區(qū)分對(duì)重復(fù)記錄的處理。默認(rèn)是ALL,表示查詢所有記錄。DISTINCT表示去掉重復(fù)的記錄

Where 條件

類似我們傳統(tǒng)SQL的where 條件

目前支持 AND,OR ,0.9版本支持between

IN, NOT IN

不支持EXIST ,NOT EXIST

 

ORDER BY與SORT BY的不同

ORDER BY 全局排序,只有一個(gè)Reduce任務(wù)

SORT BY 只在本機(jī)做排序

 

Limit

Limit 可以限制查詢的記錄數(shù)

例子1:按先件查詢

SELECT a.foo FROM invites a WHERE a.ds='<DATE>';

例子2:將查詢數(shù)據(jù)輸出至目錄

INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='<DATE>';

例子3:將查詢結(jié)果輸出至本地目錄

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;

例子4:選擇所有列到本地目錄

hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;

INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100;

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a;

INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a;

INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(1) FROM invites a WHERE a.ds='<DATE>';

INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a;

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;

例子5:將一個(gè)表的統(tǒng)計(jì)結(jié)果插入另一個(gè)表中

INSERT OVERWRITE TABLE events SELECT a.bar, count(1) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;

FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;

例子6:將多表數(shù)據(jù)插入到同一表中

FROM src

INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100

INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200

INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;

例子7:將文件流直接插入文件

FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';


Hadoop生態(tài)圈中,針對(duì)大數(shù)據(jù)進(jìn)行批量計(jì)算時(shí),通常需要一個(gè)或者多個(gè)MapReduce作業(yè)來完成,這種批量計(jì)算方式滿足不了對(duì)實(shí)時(shí)性要求高的場景。

此時(shí)就到了Storm上場的時(shí)候,那Storm又是如何高效完成實(shí)時(shí)計(jì)算的呢?下一篇我會(huì)介紹開源分布式實(shí)時(shí)計(jì)算系統(tǒng)——Storm。


(第7篇)靈活易用易維護(hù)的hadoop數(shù)據(jù)倉庫工具——Hive


如何用4個(gè)月學(xué)會(huì)Hadoop開發(fā)并找到年薪25萬工作?

 

免費(fèi)分享一套17年最新Hadoop大數(shù)據(jù)教程100Hadoop大數(shù)據(jù)必會(huì)面試題

因?yàn)殒溄咏?jīng)常被和諧,需要的朋友請加微信 ganshiyun666 來獲取最新下載鏈接,注明“51CTO”

 

教程已幫助300+人成功轉(zhuǎn)型Hadoop開發(fā),90%起薪超過20K,工資比之前翻了一倍。

百度Hadoop核心架構(gòu)師親自錄制

內(nèi)容包括0基礎(chǔ)入門、Hadoop生態(tài)系統(tǒng)、真實(shí)商業(yè)項(xiàng)目實(shí)戰(zhàn)3大部分。其中商業(yè)案例可以讓你接觸真實(shí)的生產(chǎn)環(huán)境,訓(xùn)練自己的開發(fā)能力。

(第7篇)靈活易用易維護(hù)的hadoop數(shù)據(jù)倉庫工具——Hive

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI