數(shù)據(jù)倉庫:BigQuery:BigQuery標準SQL查詢基礎(chǔ)_第1頁
數(shù)據(jù)倉庫:BigQuery:BigQuery標準SQL查詢基礎(chǔ)_第2頁
數(shù)據(jù)倉庫:BigQuery:BigQuery標準SQL查詢基礎(chǔ)_第3頁
數(shù)據(jù)倉庫:BigQuery:BigQuery標準SQL查詢基礎(chǔ)_第4頁
數(shù)據(jù)倉庫:BigQuery:BigQuery標準SQL查詢基礎(chǔ)_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

數(shù)據(jù)倉庫:BigQuery:BigQuery標準SQL查詢基礎(chǔ)1數(shù)據(jù)倉庫:BigQuery:BigQuery標準SQL查詢基礎(chǔ)1.1BigQuery簡介1.1.1BigQuery的概念與特點BigQuery是GoogleCloud提供的一種全托管、低延遲、高并發(fā)的交互式分析服務(wù),用于大規(guī)模數(shù)據(jù)集的分析。它能夠處理PB級別的數(shù)據(jù),提供快速、強大的SQL查詢能力,以及與GoogleCloud其他服務(wù)的無縫集成。BigQuery的主要特點包括:全托管服務(wù):無需管理硬件或軟件,Google負責所有運維工作。大規(guī)模數(shù)據(jù)處理:能夠處理PB級別的數(shù)據(jù),提供快速查詢響應(yīng)。低延遲查詢:使用BigQuery,可以在幾秒鐘內(nèi)查詢和分析大規(guī)模數(shù)據(jù)集。高并發(fā):支持高并發(fā)查詢,即使在高負載下也能保持穩(wěn)定性能。安全與隱私:提供嚴格的數(shù)據(jù)訪問控制和加密,確保數(shù)據(jù)安全。成本效益:按查詢量計費,無需預先購買計算資源,節(jié)省成本。1.1.2BigQuery的數(shù)據(jù)模型與架構(gòu)BigQuery采用了一種列式存儲的數(shù)據(jù)模型,這使得它在處理大規(guī)模數(shù)據(jù)時能夠高效地進行查詢。其數(shù)據(jù)架構(gòu)主要包括:項目(Project):BigQuery中的最高層級組織單位,包含多個數(shù)據(jù)集。數(shù)據(jù)集(Dataset):項目內(nèi)的數(shù)據(jù)組織單元,包含多個表和視圖。表(Table):存儲數(shù)據(jù)的基本單元,可以是常規(guī)表或分區(qū)表。視圖(View):基于一個或多個表的SQL查詢結(jié)果,可以像表一樣被查詢。存儲分區(qū)(StoragePartitioning):通過時間戳或字符串字段對數(shù)據(jù)進行分區(qū),提高查詢效率。集群(Clustering):根據(jù)指定的列對數(shù)據(jù)進行物理排序,減少查詢時的數(shù)據(jù)掃描量。1.2BigQuery標準SQL查詢基礎(chǔ)1.2.1基本查詢語句BigQuery支持標準SQL,以下是一個基本的查詢語句示例,用于從bigquery-public-data.samples.gsod表中選擇特定列,并限制結(jié)果行數(shù):--查詢BigQuery公共數(shù)據(jù)集中的全球天氣數(shù)據(jù)

SELECT

year,month,day,station,avg_temp

FROM

`bigquery-public-data.samples.gsod`

WHERE

year=2014

LIMIT

1001.2.2數(shù)據(jù)過濾與選擇使用WHERE子句可以過濾數(shù)據(jù),例如,從bigquery-public-data.samples.shakespeare表中選擇特定作品的記錄:--選擇特定作品的記錄

SELECT

corpus,line

FROM

`bigquery-public-data.samples.shakespeare`

WHERE

corpus='romeoandjuliet'1.2.3數(shù)據(jù)聚合與分組BigQuery支持使用聚合函數(shù)和GROUPBY子句對數(shù)據(jù)進行匯總和分組。以下示例展示了如何計算每個作品中單詞的平均長度:--計算每個作品中單詞的平均長度

SELECT

corpus,

AVG(LENGTH(word))ASavg_word_length

FROM

`bigquery-public-data.samples.shakespeare`

GROUPBY

corpus1.2.4子查詢與連接子查詢和連接是SQL中處理復雜查詢的重要工具。以下示例展示了如何使用子查詢和JOIN來獲取2014年平均溫度高于特定閾值的站點信息:--使用子查詢和JOIN獲取特定年份平均溫度高于閾值的站點信息

WITH

avg_tempsAS(

SELECT

station,

AVG(avg_temp)ASstation_avg_temp

FROM

`bigquery-public-data.samples.gsod`

WHERE

year=2014

GROUPBY

station

)

SELECT

t1.station,

t1.year,

t1.month,

t1.day,

t1.avg_temp

FROM

`bigquery-public-data.samples.gsod`t1

JOIN

avg_tempst2

ON

t1.station=t2.station

WHERE

t2.station_avg_temp>201.2.5窗口函數(shù)窗口函數(shù)允許在查詢中進行復雜的分析,如計算累計總和、排名等。以下示例展示了如何使用窗口函數(shù)計算每個站點的累計平均溫度:--使用窗口函數(shù)計算每個站點的累計平均溫度

SELECT

station,

year,

month,

day,

avg_temp,

SUM(avg_temp)OVER(PARTITIONBYstationORDERBYyear,month,day)AScumulative_avg_temp

FROM

`bigquery-public-data.samples.gsod`

WHERE

year=20141.2.6創(chuàng)建與管理數(shù)據(jù)集和表在BigQuery中,可以創(chuàng)建和管理數(shù)據(jù)集與表。以下示例展示了如何創(chuàng)建一個新的數(shù)據(jù)集和表:--創(chuàng)建一個新的數(shù)據(jù)集

CREATEDATASETIFNOTEXISTSmy_dataset;

--創(chuàng)建一個新的表

CREATETABLEIFNOTEXISTSmy_dataset.my_table(

idINT64NOTNULL,

nameSTRING,

ageINT64,

timestampTIMESTAMP,

)PRIMARYKEY(id);1.2.7加載數(shù)據(jù)BigQuery提供了多種方式來加載數(shù)據(jù),包括從GoogleCloudStorage加載。以下示例展示了如何從GoogleCloudStorage加載CSV數(shù)據(jù)到BigQuery表:--從GoogleCloudStorage加載CSV數(shù)據(jù)到BigQuery表

LOADDATAINFILE'gs://my-bucket/data.csv'

INTOTABLEmy_dataset.my_table

FIELDSTERMINATEDBY','

LINESTERMINATEDBY'\n'

IGNORE1ROWS

(id,name,age,timestamp);1.2.8導出數(shù)據(jù)導出數(shù)據(jù)到GoogleCloudStorage是BigQuery的常見操作。以下示例展示了如何將查詢結(jié)果導出到GoogleCloudStorage:--將查詢結(jié)果導出到GoogleCloudStorage

EXPORTDATAOPTIONS(

uri='gs://my-bucket/exported_data.csv',

format='CSV',

overwrite=true

)AS

SELECT

*

FROM

my_dataset.my_table

WHERE

age>30;1.3總結(jié)BigQuery是一個強大的數(shù)據(jù)倉庫解決方案,通過其標準SQL查詢能力,用戶可以高效地分析大規(guī)模數(shù)據(jù)集。從基本查詢到復雜的數(shù)據(jù)分析,BigQuery提供了豐富的功能和工具。通過上述示例,我們了解了如何在BigQuery中執(zhí)行基本的SQL查詢,管理數(shù)據(jù)集和表,以及如何加載和導出數(shù)據(jù)。掌握這些基礎(chǔ)是進行更高級數(shù)據(jù)分析和報告的起點。2數(shù)據(jù)倉庫:BigQuery:BigQuery標準SQL查詢基礎(chǔ)2.1BigQuery標準SQL基礎(chǔ)2.1.1SQL查詢語法入門在BigQuery中,標準SQL是執(zhí)行數(shù)據(jù)查詢和分析的主要語言。它提供了一種強大而靈活的方式來處理大規(guī)模數(shù)據(jù)集。下面,我們將通過幾個示例來介紹BigQuery標準SQL的基礎(chǔ)語法。示例:查詢單個列假設(shè)我們有一個名為employees的表,其中包含employee_id,first_name,last_name,email,hire_date等列。如果我們只想查看所有員工的電子郵件地址,可以使用以下查詢:--查詢employees表中的所有email地址

SELECTemail

FROM`project.dataset.employees`示例:使用WHERE子句如果我們想找到所有在2010年之后被雇傭的員工,可以使用WHERE子句來過濾結(jié)果:--查詢2010年之后被雇傭的員工

SELECT*

FROM`project.dataset.employees`

WHEREhire_date>='2010-01-01'示例:使用GROUPBY和聚合函數(shù)BigQuery允許我們使用GROUPBY子句和聚合函數(shù)(如COUNT,SUM,AVG等)來對數(shù)據(jù)進行分組和匯總。例如,如果我們想計算每個部門的員工數(shù)量:--計算每個部門的員工數(shù)量

SELECTdepartment,COUNT(*)asnum_employees

FROM`project.dataset.employees`

GROUPBYdepartment2.1.2數(shù)據(jù)類型與表結(jié)構(gòu)BigQuery支持多種數(shù)據(jù)類型,包括數(shù)值類型、字符串類型、日期時間類型、布爾類型和復雜類型(如數(shù)組和結(jié)構(gòu))。了解這些數(shù)據(jù)類型對于設(shè)計表結(jié)構(gòu)和編寫有效的SQL查詢至關(guān)重要。示例:創(chuàng)建一個表下面的示例展示了如何創(chuàng)建一個包含不同數(shù)據(jù)類型的表:--創(chuàng)建一個包含不同數(shù)據(jù)類型的表

CREATETABLE`project.dataset.orders`(

order_idINT64NOTNULL,

order_dateDATE,

customer_nameSTRING,

total_priceFLOAT64,

itemsARRAY<STRUCT<product_idINT64,quantityINT64>>,

PRIMARYKEY(order_id)

);在這個示例中,orders表包含以下列:-order_id:一個整數(shù),作為主鍵,用于唯一標識每個訂單。-order_date:一個日期類型,用于存儲訂單日期。-customer_name:一個字符串類型,用于存儲客戶名稱。-total_price:一個浮點數(shù)類型,用于存儲訂單的總價格。-items:一個數(shù)組類型,其中每個元素是一個結(jié)構(gòu),包含product_id和quantity。示例:插入數(shù)據(jù)一旦表創(chuàng)建完成,我們可以使用INSERT語句來插入數(shù)據(jù):--向orders表中插入數(shù)據(jù)

INSERTINTO`project.dataset.orders`(order_id,order_date,customer_name,total_price,items)

VALUES

(1,'2023-01-01','Alice',120.5,[{product_id:101,quantity:2},{product_id:102,quantity:1}]),

(2,'2023-01-02','Bob',75.0,[{product_id:103,quantity:3}]);示例:查詢復雜類型查詢包含復雜類型(如數(shù)組和結(jié)構(gòu))的列需要使用特定的函數(shù)和操作符。例如,如果我們想找到訂單1中包含的所有產(chǎn)品ID:--查詢訂單1中包含的所有產(chǎn)品ID

SELECTduct_id

FROM`project.dataset.orders`

WHEREorder_id=1

ANDitems.offset=ANY(SELECToffsetFROMUNNEST(items))在這個查詢中,我們使用了UNNEST函數(shù)來展開items數(shù)組,然后使用ANY操作符來匹配數(shù)組中的任何元素。示例:使用JOIN子句BigQuery支持多種類型的JOIN操作,包括INNERJOIN,LEFTJOIN,RIGHTJOIN和FULLJOIN。例如,如果我們有兩個表orders和customers,并且想找到每個訂單的客戶信息:--使用INNERJOIN連接orders和customers表

SELECTo.order_id,o.order_date,c.customer_name

FROM`project.dataset.orders`o

INNERJOIN`project.dataset.customers`cONo.customer_id=c.customer_id在這個示例中,我們使用INNERJOIN來連接orders和customers表,基于customer_id列。通過以上示例,我們介紹了BigQuery標準SQL的基礎(chǔ)語法和數(shù)據(jù)類型,以及如何使用這些語法來創(chuàng)建表、插入數(shù)據(jù)、查詢數(shù)據(jù)和執(zhí)行JOIN操作。掌握這些基本概念將幫助你在BigQuery中更有效地進行數(shù)據(jù)處理和分析。3數(shù)據(jù)查詢與篩選3.1基本的SELECT語句在BigQuery中,SELECT語句是最基本的數(shù)據(jù)查詢工具,用于從一個或多個表中檢索數(shù)據(jù)。通過SELECT語句,你可以指定想要檢索的列,以及如何從數(shù)據(jù)中提取信息。3.1.1語法SELECTcolumn1,column2,...

FROMtable_name;3.1.2示例假設(shè)我們有一個名為sales的表,其中包含product_id、sale_date和quantity等列。下面的SELECT語句將從sales表中選擇所有列:--查詢sales表中的所有列

SELECT*

FROM`project.dataset.sales`;如果你想只選擇product_id和quantity兩列,可以這樣寫:--查詢sales表中的product_id和quantity列

SELECTproduct_id,quantity

FROM`project.dataset.sales`;3.2WHERE子句與條件篩選WHERE子句用于從表中篩選出滿足特定條件的行。這在處理大量數(shù)據(jù)時非常有用,可以讓你專注于特定的數(shù)據(jù)子集。3.2.1語法SELECTcolumn1,column2,...

FROMtable_name

WHEREcondition;3.2.2示例繼續(xù)使用sales表的例子,假設(shè)我們只對2023年1月的銷售數(shù)據(jù)感興趣,可以使用WHERE子句來篩選:--查詢2023年1月的銷售數(shù)據(jù)

SELECTproduct_id,quantity

FROM`project.dataset.sales`

WHEREsale_date>='2023-01-01'ANDsale_date<'2023-02-01';如果我們要篩選出銷售量大于100的產(chǎn)品,可以這樣寫:--查詢銷售量大于100的產(chǎn)品

SELECTproduct_id,quantity

FROM`project.dataset.sales`

WHEREquantity>100;3.2.3復合條件你還可以使用邏輯運算符AND、OR和NOT來組合多個條件,以更精確地篩選數(shù)據(jù)。--查詢2023年1月銷售量大于100且產(chǎn)品ID為123的產(chǎn)品

SELECTproduct_id,quantity

FROM`project.dataset.sales`

WHEREsale_date>='2023-01-01'ANDsale_date<'2023-02-01'

ANDproduct_id=123ANDquantity>100;3.2.4使用IN子句IN子句可以用來匹配列值是否在指定的列表中。--查詢產(chǎn)品ID為123或456的銷售數(shù)據(jù)

SELECTproduct_id,quantity

FROM`project.dataset.sales`

WHEREproduct_idIN(123,456);3.2.5使用LIKE子句LIKE子句用于在WHERE子句中搜索列中的指定模式。--查詢產(chǎn)品ID以1開頭的銷售數(shù)據(jù)

SELECTproduct_id,quantity

FROM`project.dataset.sales`

WHEREproduct_idLIKE'1%';3.2.6使用BETWEEN子句BETWEEN子句用于選擇列值在指定范圍內(nèi)的行。--查詢銷售量在100到200之間的產(chǎn)品

SELECTproduct_id,quantity

FROM`project.dataset.sales`

WHEREquantityBETWEEN100AND200;3.2.7使用ISNULL和ISNOTNULLISNULL和ISNOTNULL用于檢查列值是否為NULL。--查詢銷售日期為空的銷售記錄

SELECTproduct_id,sale_date

FROM`project.dataset.sales`

WHEREsale_dateISNULL;通過這些SELECT語句和WHERE子句的組合使用,你可以在BigQuery中高效地查詢和篩選數(shù)據(jù),滿足各種分析需求。4數(shù)據(jù)排序與分組4.1ORDERBY子句排序數(shù)據(jù)在BigQuery中,ORDERBY子句用于對查詢結(jié)果進行排序。這可以是升序(ASC,默認)或降序(DESC)。通過指定一個或多個列,可以控制結(jié)果集的排序方式,這對于數(shù)據(jù)分析和報告特別有用。4.1.1語法SELECTcolumn1,column2,...

FROMtable

ORDERBYcolumn1[ASC|DESC],column2[ASC|DESC],...;4.1.2示例假設(shè)我們有一個名為sales的表,其中包含product_id,sale_date和quantity等列。我們想要查看按銷售日期降序排列的產(chǎn)品銷售情況。--查詢產(chǎn)品銷售數(shù)據(jù),按銷售日期降序排序

SELECTproduct_id,sale_date,quantity

FROM`project.dataset.sales`

ORDERBYsale_dateDESC;在這個例子中,ORDERBYsale_dateDESC確保了結(jié)果集中的銷售記錄是按最近的銷售日期首先顯示。4.2GROUPBY子句分組數(shù)據(jù)GROUPBY子句用于將數(shù)據(jù)集中的行按一個或多個列的值進行分組。這通常與聚合函數(shù)(如SUM,AVG,COUNT等)一起使用,以對每個組執(zhí)行計算。4.2.1語法SELECTcolumn1,aggregate_function(column2),...

FROMtable

GROUPBYcolumn1,...;4.2.2示例繼續(xù)使用sales表,我們想要計算每個產(chǎn)品的總銷售量。--計算每個產(chǎn)品的總銷售量

SELECTproduct_id,SUM(quantity)astotal_quantity

FROM`project.dataset.sales`

GROUPBYproduct_id;在這個例子中,GROUPBYproduct_id將銷售記錄按產(chǎn)品ID分組,而SUM(quantity)則計算每個產(chǎn)品組的銷售總量。4.2.3復雜示例:排序與分組結(jié)合使用我們可能還想要按總銷售量降序排列這些產(chǎn)品。--計算每個產(chǎn)品的總銷售量,并按總銷售量降序排序

SELECTproduct_id,SUM(quantity)astotal_quantity

FROM`project.dataset.sales`

GROUPBYproduct_id

ORDERBYtotal_quantityDESC;在這個例子中,我們首先按product_id對數(shù)據(jù)進行分組,然后使用ORDERBYtotal_quantityDESC對每個產(chǎn)品的總銷售量進行降序排序,從而可以快速識別哪些產(chǎn)品是最暢銷的。通過結(jié)合使用ORDERBY和GROUPBY,我們可以對數(shù)據(jù)進行更深入的分析,不僅能夠分組數(shù)據(jù),還能夠根據(jù)特定的指標對這些組進行排序,從而獲得更有洞察力的信息。5聚合函數(shù)與統(tǒng)計分析5.1使用聚合函數(shù)進行統(tǒng)計在BigQuery中,聚合函數(shù)用于對一組值執(zhí)行計算,以返回單個值或一組匯總值。這些函數(shù)對于數(shù)據(jù)分析至關(guān)重要,可以幫助我們理解數(shù)據(jù)的總體趨勢和模式。以下是一些常用的BigQuery聚合函數(shù):COUNT():計算行數(shù),可以用于計算非空值的數(shù)量。SUM():計算數(shù)值列的總和。AVG():計算數(shù)值列的平均值。MIN()和MAX():分別返回數(shù)值列的最小值和最大值。GROUP_CONCAT():將一組值連接成一個字符串,常用于文本數(shù)據(jù)的匯總。5.1.1示例:使用COUNT()統(tǒng)計非空值假設(shè)我們有一個sales表,其中包含product_id和quantity列,我們想要統(tǒng)計有多少不同的產(chǎn)品被銷售過。--SQL查詢示例

SELECTCOUNT(DISTINCTproduct_id)AStotal_products_sold

FROM`project.dataset.sales`

WHEREquantity>0;5.1.2示例:使用SUM()和AVG()計算總銷售額和平均銷售額如果我們想要計算總銷售額和平均銷售額,可以使用SUM()和AVG()函數(shù)。--SQL查詢示例

SELECT

SUM(quantity*price)AStotal_sales,

AVG(quantity*price)ASaverage_sales

FROM`project.dataset.sales`;5.2統(tǒng)計分析案例實踐統(tǒng)計分析在數(shù)據(jù)倉庫中是常見的需求,BigQuery提供了強大的工具來支持這些分析。下面通過一個案例來實踐如何使用BigQuery進行統(tǒng)計分析。5.2.1案例:分析用戶行為假設(shè)我們有一個user_activity表,包含user_id、activity_date和activity_type列,我們想要分析每個用戶的活動類型頻率。查詢1:每個用戶每種活動類型的總次數(shù)--SQL查詢示例

SELECTuser_id,activity_type,COUNT(*)ASactivity_count

FROM`project.dataset.user_activity`

GROUPBYuser_id,activity_type;查詢2:每個活動類型的平均頻率為了計算每個活動類型的平均頻率,我們首先需要確定每個用戶活動的總天數(shù),然后計算每種活動類型的平均頻率。--SQL查詢示例

WITHuser_activity_daysAS(

SELECTuser_id,COUNT(DISTINCTactivity_date)AStotal_days

FROM`project.dataset.user_activity`

GROUPBYuser_id

),

activity_countsAS(

SELECTuser_id,activity_type,COUNT(*)ASactivity_count

FROM`project.dataset.user_activity`

GROUPBYuser_id,activity_type

)

SELECT

activity_type,

AVG(CAST(activity_countASFLOAT64)/total_days)ASaverage_frequency

FROM

activity_counts

JOIN

user_activity_days

ON

activity_counts.user_id=user_activity_days.user_id

GROUPBY

activity_type;5.2.2解釋在上述案例中,我們首先使用WITH子句創(chuàng)建了兩個臨時表:user_activity_days和activity_counts。user_activity_days表計算了每個用戶的活動總天數(shù),而activity_counts表計算了每個用戶每種活動類型的總次數(shù)。然后,我們將這兩個表通過JOIN操作連接起來,以計算每種活動類型的平均頻率。通過這些查詢,我們可以深入了解用戶的行為模式,例如,哪種活動類型最受歡迎,以及用戶在不同活動類型上的參與度如何。這有助于企業(yè)做出更明智的決策,優(yōu)化產(chǎn)品或服務(wù),以更好地滿足用戶需求。6數(shù)據(jù)倉庫:BigQuery:BigQuery標準SQL查詢基礎(chǔ)6.1連接與子查詢6.1.1INNERJOIN與LEFTJOIN在BigQuery中,INNERJOIN和LEFTJOIN是兩種常用的連接類型,用于將兩個或多個表的數(shù)據(jù)結(jié)合在一起。這些連接基于一個或多個鍵的匹配條件,允許你從多個數(shù)據(jù)源中提取信息。INNERJOININNERJOIN返回兩個表中匹配的行。如果在連接的兩個表中沒有找到匹配的行,則不會返回任何結(jié)果。這通常用于當你只關(guān)心兩個表中都存在的數(shù)據(jù)時。示例代碼:--查詢示例:使用INNERJOIN連接兩個表

SELECTOrders.OrderID,Customers.CustomerName

FROM`bigquery-public-data.samples.orders`ASOrders

INNERJOIN`bigquery-public-data.samples.customers`ASCustomers

ONOrders.CustomerID=Customers.CustomerID;數(shù)據(jù)樣例:假設(shè)我們有兩個表,orders和customers,其中orders表包含訂單信息,customers表包含客戶信息。orders表如下:OrderIDCustomerIDOrderDate11012021-01-0121022021-01-0231032021-01-0341042021-01-04customers表如下:CustomerIDCustomerNameContactName101AliceSmith102BobJohnson103CharlieBrown結(jié)果解釋:使用INNERJOIN后,結(jié)果將只包含orders和customers表中CustomerID匹配的行。因此,結(jié)果將不包括CustomerID為104的行,因為它在customers表中沒有匹配。LEFTJOINLEFTJOIN返回左表(FROM子句中的表)中的所有行,即使在右表中沒有匹配的行。如果右表中沒有匹配的行,則結(jié)果中的那些列將包含NULL值。這在你需要保留左表中所有數(shù)據(jù),同時嘗試從右表中獲取額外信息時非常有用。示例代碼:--查詢示例:使用LEFTJOIN連接兩個表

SELECTOrders.OrderID,Customers.CustomerName

FROM`bigquery-public-data.samples.orders`ASOrders

LEFTJOIN`bigquery-public-data.samples.customers`ASCustomers

ONOrders.CustomerID=Customers.CustomerID;數(shù)據(jù)樣例:使用與INNERJOIN相同的orders和customers表。結(jié)果解釋:LEFTJOIN將返回orders表中的所有行,即使在customers表中沒有找到匹配的CustomerID。因此,即使CustomerID為104的行在customers表中沒有匹配,它仍然會被包含在結(jié)果中,CustomerName列將顯示為NULL。6.1.2子查詢與嵌套查詢子查詢是在另一個查詢語句中嵌套的查詢。它們可以用于過濾、聚合或作為連接的一部分。子查詢可以嵌套在SELECT、FROM、WHERE或JOIN子句中。子查詢示例假設(shè)我們想要找到所有訂單金額超過平均訂單金額的訂單。我們可以使用子查詢來計算平均訂單金額,然后在主查詢中使用這個值。示例代碼:--查詢示例:使用子查詢找到訂單金額超過平均值的訂單

SELECTOrderID,OrderAmount

FROM`bigquery-public-data.samples.orders`

WHEREOrderAmount>(

SELECTAVG(OrderAmount)

FROM`bigquery-public-data.samples.orders`

);數(shù)據(jù)樣例:orders表如下:OrderIDOrderAmount1100220033004400550結(jié)果解釋:子查詢首先計算orders表中所有訂單的平均OrderAmount。然后,主查詢使用這個平均值來過濾出所有OrderAmount大于平均值的訂單。在這個例子中,結(jié)果將只包含OrderID為2、3和4的行,因為它們的OrderAmount大于平均值。嵌套查詢嵌套查詢是將一個查詢的結(jié)果作為另一個查詢的一部分。這可以用于創(chuàng)建更復雜的查詢邏輯,例如,從一個結(jié)果集中選擇特定的行,然后在這些行上執(zhí)行進一步的查詢。示例代碼:--查詢示例:使用嵌套查詢找到特定客戶的所有訂單

SELECTOrderID,OrderAmount

FROM(

SELECTOrderID,OrderAmount

FROM`bigquery-public-data.samples.orders`

WHERECustomerID=101

)ASSpecificCustomerOrders

WHEREOrderAmount>150;數(shù)據(jù)樣例:使用與之前相同的orders表。結(jié)果解釋:首先,內(nèi)部查詢選擇CustomerID為101的所有訂單。然后,外部查詢從這些結(jié)果中進一步篩選出OrderAmount大于150的訂單。在這個例子中,如果CustomerID為101的訂單中只有OrderID為1的訂單金額超過150,那么結(jié)果將只包含這一行。通過這些示例,你可以看到INNERJOIN、LEFTJOIN、子查詢和嵌套查詢?nèi)绾卧贐igQuery中被用來處理和分析復雜的數(shù)據(jù)集。這些技術(shù)是構(gòu)建高效和精確的SQL查詢的關(guān)鍵,特別是在處理大型數(shù)據(jù)倉庫時。7數(shù)據(jù)倉庫優(yōu)化技術(shù)7.1查詢優(yōu)化技巧7.1.1理解BigQuery的執(zhí)行計劃在BigQuery中,優(yōu)化查詢的第一步是理解查詢的執(zhí)行計劃。BigQuery使用成本基礎(chǔ)優(yōu)化器(CBO)來決定如何執(zhí)行查詢,包括掃描表的順序、連接類型等。通過查看執(zhí)行計劃,可以識別查詢中的瓶頸,例如不必要的全表掃描或低效的連接操作。示例:分析執(zhí)行計劃--查詢示例

SELECTt1.col1,t2.col2

FROM`project.dataset.table1`t1

JOIN`project.dataset.table2`t2

ONt1.id=t2.id

WHEREt1.col1='value';

--分析執(zhí)行計劃

EXPLAINPLANFORSELECTt1.col1,t2.col2

FROM`project.dataset.table1`t1

JOIN`project.dataset.table2`t2

ONt1.id=t2.id

WHEREt1.col1='value';在上述查詢中,使用EXPLAINPLAN命令可以查看BigQuery如何執(zhí)行查詢。這有助于識別是否需要添加索引、調(diào)整JOIN條件或優(yōu)化WHERE子句。7.1.2使用索引BigQuery不支持傳統(tǒng)意義上的索引,但通過合理設(shè)計表結(jié)構(gòu)和使用分區(qū)、集群可以達到類似的效果,提高查詢性能。示例:創(chuàng)建分區(qū)表--創(chuàng)建分區(qū)表

CREATETABLE`project.dataset.partitioned_table`(

idINT64,

dateTIMESTAMP,

col1STRING,

col2INT64

)

PARTITIONBYDATE(date);通過將表按日期分區(qū),可以減少查詢時掃描的數(shù)據(jù)量,特別是當查詢只針對特定日期范圍的數(shù)據(jù)時。7.1.3選擇正確的JOIN類型BigQuery支持三種JOIN類型:INNERJOIN、LEFTJOIN和FULLJOIN。選擇正確的JOIN類型可以顯著提高查詢效率。示例:使用INNERJOIN--使用INNERJOIN

SELECTt1.col1,t2.col2

FROM`project.dataset.table1`t1

INNERJOIN`project.dataset.table2`t2

ONt1.id=t2.id;INNERJOIN只返回兩個表中匹配的行,如果兩個表的大小相近,且JOIN條件能夠有效過濾數(shù)據(jù),INNERJOIN通常是最高效的。7.1.4限制返回的行數(shù)使用LIMIT子句可以限制查詢返回的行數(shù),這對于快速獲取結(jié)果或進行初步數(shù)據(jù)探索非常有用。示例:使用LIMIT--使用LIMIT

SELECT*

FROM`project.dataset.table`

LIMIT1000;此查詢將只返回前1000行,有助于減少數(shù)據(jù)傳輸和處理時間。7.2數(shù)據(jù)分區(qū)與集群7.2.1數(shù)據(jù)分區(qū)數(shù)據(jù)分區(qū)是將大數(shù)據(jù)集分割成更小、更易于管理的部分的過程。在BigQuery中,可以使用日期、時間戳或整數(shù)字段作為分區(qū)鍵。示例:查詢分區(qū)表--查詢特定分區(qū)

SELECT*

FROM`project.dataset.partitioned_table`

WHERE_PARTITIONTIMEBETWEENTIMESTAMP('2023-01-01')ANDTIMESTAMP('2023-01-31');通過限制查詢的分區(qū),可以避免掃描整個表,從而提高查詢速度。7.2.2數(shù)據(jù)集群數(shù)據(jù)集群是根據(jù)特定列對數(shù)據(jù)進行物理排序的過程。這有助于減少JOIN操作時的數(shù)據(jù)掃描量,因為BigQuery可以更快地找到匹配的行。示例:創(chuàng)建集群表--創(chuàng)建集群表

CREATETABLE`project.dataset.clustered_table`(

idINT64,

col1STRING,

col2INT64

)

CLUSTERBYid;通過將表按id列集群,可以提高基于id的JOIN操作的效率。7.2.3結(jié)合使用分區(qū)和集群結(jié)合使用數(shù)據(jù)分區(qū)和集群可以進一步優(yōu)化查詢性能。例如,可以創(chuàng)建一個按日期分區(qū)的表,并按id列集群,以提高基于日期和id的查詢效率。示例:創(chuàng)建分區(qū)并集群的表--創(chuàng)建分區(qū)并集群的表

CREATETABLE`project.dataset.partitioned_clustered_table`(

idINT64,

dateTIMESTAMP,

col1STRING,

col2INT64

)

PARTITIONBYDATE(date)

CLUSTERBYid;此表結(jié)構(gòu)允許快速查詢特定日期范圍內(nèi)的數(shù)據(jù),并且基于id的JOIN操作也將更高效。通過以上技巧,可以顯著提高BigQuery中的查詢性能,減少成本并提高數(shù)據(jù)處理的效率。在設(shè)計查詢和表結(jié)構(gòu)時,始終考慮數(shù)據(jù)的分布和查詢的模式,以實現(xiàn)最佳的性能優(yōu)化。8高級查詢與函數(shù)8.1窗口函數(shù)應(yīng)用8.1.1理解窗口函數(shù)窗口函數(shù)在BigQuery中是一種強大的工具,它允許在結(jié)果集的行上執(zhí)行計算,而無需進行子查詢或自連接。窗口函數(shù)可以在一個數(shù)據(jù)集上執(zhí)行聚合操作,同時保留每一行的原始信息。這在處理時間序列數(shù)據(jù)、排名、滑動窗口統(tǒng)計等場景中特別有用。8.1.2常見窗口函數(shù)ROW_NUMBER():為每一行分配一個唯一的行號。RANK():根據(jù)指定的排序規(guī)則為每一行分配一個排名,相同值的行會共享排名。DENSE_RANK():類似于RANK(),但不會跳過排名。LAG():訪問當前行前的行數(shù)據(jù)。LEAD():訪問當前行后的行數(shù)據(jù)。SUM()OVER:在指定窗口內(nèi)進行求和。AVG()OVER:在指定窗口內(nèi)計算平均值。8.1.3示例:使用窗口函數(shù)進行排名假設(shè)我們有一個銷售數(shù)據(jù)表sales,包含salesperson,sale_date,和amount字段。我們想要找出每個月銷售業(yè)績最好的銷售人員。--BigQueryStandardSQL

WITHsales_dataAS(

SELECTsalesperson,sale_date,amount

FROM`project.dataset.sales`

)

SELECTsalesperson,sale_date,amount,

RANK()OVER(PARTITIONBYEXTRACT(MONTHFROMsale_date)ORDERBYamountDESC)ASmonthly_rank

FROMsales_data

ORDERBYsale_date,monthly_rank;在這個例子中,RANK()函數(shù)被用于計算每個月內(nèi)根據(jù)amount字段降序排列的銷售人員排名。PARTITIONBY子句確保了每個月的銷售數(shù)據(jù)被獨立處理,而ORDERBY子句定義了排名的依據(jù)。8.2用戶自定義函數(shù)與存儲過程8.2.1用戶自定義函數(shù)用戶自定義函數(shù)(UDF)允許在BigQuery查詢中定義和使用自定義的函數(shù)。這可以用于執(zhí)行復雜的計算,如數(shù)學運算、字符串處理或邏輯判斷,從而增強SQL查詢的靈活性和功能。8.2.2存儲過程存儲過程是預定義的SQL代碼塊,可以接受輸入?yún)?shù),執(zhí)行一系列操作,并返回結(jié)果。它們可以用于執(zhí)行復雜的業(yè)務(wù)邏輯,如數(shù)據(jù)清洗、數(shù)據(jù)轉(zhuǎn)換或數(shù)據(jù)加載任務(wù),有助于減少查詢的復雜性和提高執(zhí)行效率。8.2.3示例:創(chuàng)建用戶自定義函數(shù)假設(shè)我們需要一個函數(shù)來計算兩個日期之間的天數(shù)差。--創(chuàng)建用戶自定義函數(shù)

CREATETEMPFUNCTIONdate_diff_in_days(date1DATE,date2DATE)

RETURNSINT64

LANGUAGEjsAS"""

return(newDate(date2).getTime()-newDate(date1).getTime())/(1000*60*60*24);

""";

--使用UDF

WITHsales_dataAS(

SELECTsalesperson,sale_date,amount

FROM`project.dataset.sales`

)

SELECTsalesperson,sale_date,amount,

date_diff_in_days(sale_date,'2023-01-01')ASdays_since_new_year

FROMsales_data

ORDERBYdays_since_new_year;在這個例子中,我們首先使用CREATETEMPFUNCTION語句定義了一個JavaScript函數(shù)date_diff_in_days,用于計算兩個日期之間的天數(shù)差。然后在WITH子句中創(chuàng)建了一個包含銷售數(shù)據(jù)的臨時表,并在SELECT語句中使用了這個UDF來計算每筆銷售距離2023年1月1日的天數(shù)。8.2.4示例:創(chuàng)建存儲過程假設(shè)我們有一個需求,需要定期執(zhí)行數(shù)據(jù)清洗任務(wù),移除所有銷售金額小于100的記錄。--創(chuàng)建存儲過程

CREATEPROCEDUREclean_sales_data(INmin_amountINT64)

LANGUAGESQL

AS$$

DELETEFROM`project.dataset.sales`

WHEREamount<min_amount;

$$;

--調(diào)用存儲過程

CALLclean_sales_data(100);在這個例子中,我們使用CREATEPROCEDURE語句定義了一個存儲過程clean_sales_data,它接受一個參數(shù)min_amount,并刪除所有銷售金額小于這個參數(shù)值的記錄。通過調(diào)用CALLclean_sales_data(100);,我們可以執(zhí)行這個存儲過程,移除所有金額小于100的銷售記錄。以上示例展示了如何在BigQuery中使用窗口函數(shù)和用戶自定義函數(shù)與存儲過程來執(zhí)行更復雜的數(shù)據(jù)處理任務(wù)。通過這些高級功能,可以更有效地分析和操作數(shù)據(jù),提高數(shù)據(jù)倉庫的使用效率和數(shù)據(jù)分析的深度。9數(shù)據(jù)倉庫:BigQuery:數(shù)據(jù)導入與導出9.1從GCS導入數(shù)據(jù)在BigQuery中,從GoogleCloudStorage(GCS)導入數(shù)據(jù)是一個常見的操作,尤其當你需要將大量數(shù)據(jù)快速加載到BigQuery表中時。以下是如何使用BigQuery標準SQL從GCS導入數(shù)據(jù)的步驟和示例。9.1.1步驟1:準備GCS中的數(shù)據(jù)文件假設(shè)你有一個CSV文件存儲在GCS的bucket中,文件名為data.csv,bucket名為my-bucket。CSV文件的格式如下:id,name,age

1,John,30

2,Alice,25

3,Bob,359.1.2步驟2:使用BigQuery導入數(shù)據(jù)你可以使用BigQuery的LOADDATA語句來從GCS導入數(shù)據(jù)。下面是一個示例SQL語句:--導入數(shù)據(jù)到BigQuery表

LOADDATAINFILE'gs://my-bucket/data.csv'

INTOTABLE`my-project.my_dataset.my_table`

FIELDSTERMINATEDBY','

LINESTERMINATEDBY'\n'

IGNORE1ROWS

(id,name,age);在這個示例中:-gs://my-bucket/data.csv是GCS中數(shù)據(jù)文件的URL。-my-project.my_dataset.my_table是BigQuery中目標表的完整路徑。-FIELDSTERMINATEDBY','和LINESTERMINATEDBY'\n'指定了CSV文件的字段和行分隔符。-IGNORE1ROWS用于跳過CSV文件的第一行,通常這是列名行。-(id,name,age)指定了表的列名,它們與CSV文件中的列一一對應(yīng)。9.1.3步驟3:驗證數(shù)據(jù)導入導入數(shù)據(jù)后,你可以通過查詢表來驗證數(shù)據(jù)是否正確導入:--查詢導入的數(shù)據(jù)

SELECT*FROM`my-project.my_dataset.my_table`;9.2導出數(shù)據(jù)到GCS同樣,將BigQuery中的數(shù)據(jù)導出到GCS也是處理大數(shù)據(jù)集時的常見需求。以下是如何使用BigQuery標準SQL導出數(shù)據(jù)到GCS的示例。9.2.1步驟1:準備BigQuery表假設(shè)你有一個名為my_table的BigQuery表,其中包含以下數(shù)據(jù):idnameage1John302Alice253Bob359.2.2步驟2:使用BigQuery導出數(shù)據(jù)你可以使用BigQuery的EXPORTDATA命令來將數(shù)據(jù)導出到GCS。下面是一個示例SQL語句:--導出數(shù)據(jù)到GCS

EXPORTDATAOPTIONS(

uri='gs://my-bucket/exported_data.csv',

format='CSV',

overwrite=true

)AS

SELECT*FROM`my-project.my_dataset.my_table`;在這個示例中:-uri='gs://my-bucket/exported_data.csv'指定了GCS中導出數(shù)據(jù)的URL。-format='CSV'指定了導出數(shù)據(jù)的格式為CSV。-overwrite=true表示如果GCS中已有同名文件,將覆蓋原有文件。-SELECT*FROMmy-project.my_dataset.my_table'是查詢語句,用于指定要導出的數(shù)據(jù)。9.2.3步驟3:驗證數(shù)據(jù)導出數(shù)據(jù)導出后,你可以登錄到GoogleCloudConsole,然后在GCS的bucket中查看是否有一個名為exported_data.csv的文件。打開文件,你將看到以下內(nèi)容:id,name,age

1,John,30

2,Alice,25

3,Bob,35這表明數(shù)據(jù)已成功從BigQuery導出到GCS。9.3注意事項

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論