BigQuery:BigQuerySQL語言高級應(yīng)用_第1頁
BigQuery:BigQuerySQL語言高級應(yīng)用_第2頁
BigQuery:BigQuerySQL語言高級應(yīng)用_第3頁
BigQuery:BigQuerySQL語言高級應(yīng)用_第4頁
BigQuery:BigQuerySQL語言高級應(yīng)用_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

BigQuery:BigQuerySQL語言高級應(yīng)用1BigQuerySQL高級查詢技巧1.1使用窗口函數(shù)進(jìn)行復(fù)雜數(shù)據(jù)分析在BigQuery中,窗口函數(shù)允許你在數(shù)據(jù)的特定窗口或范圍內(nèi)執(zhí)行計算,而無需對數(shù)據(jù)進(jìn)行分組或聚合。這在分析時間序列數(shù)據(jù)、計算移動平均、排名、行數(shù)等場景中特別有用。窗口函數(shù)可以分為兩類:分析函數(shù)和排名函數(shù)。1.1.1分析函數(shù)示例:計算移動平均假設(shè)我們有一個銷售數(shù)據(jù)表sales,包含date和amount兩列,我們想要計算過去7天的移動平均銷售額。--使用窗口函數(shù)計算過去7天的移動平均銷售額

WITHsalesAS(

SELECT

'2023-01-01'ASdate,100ASamountUNIONALL

SELECT

'2023-01-02'ASdate,150ASamountUNIONALL

SELECT

'2023-01-03'ASdate,200ASamountUNIONALL

SELECT

'2023-01-04'ASdate,250ASamountUNIONALL

SELECT

'2023-01-05'ASdate,300ASamountUNIONALL

SELECT

'2023-01-06'ASdate,350ASamountUNIONALL

SELECT

'2023-01-07'ASdate,400ASamountUNIONALL

SELECT

'2023-01-08'ASdate,450ASamountUNIONALL

SELECT

'2023-01-09'ASdate,500ASamountUNIONALL

SELECT

'2023-01-10'ASdate,550ASamount

)

SELECT

date,

amount,

AVG(amount)OVER(

ORDERBYdate

ROWSBETWEEN6PRECEDINGANDCURRENTROW

)ASmoving_average

FROM

sales

ORDERBY

date;在這個例子中,AVG(amount)OVER是一個窗口函數(shù),它計算了當(dāng)前行及其前6行的平均值,從而得到過去7天的移動平均銷售額。1.1.2排名函數(shù)示例:計算銷售額排名繼續(xù)使用sales表,我們想要計算每個日期的銷售額排名。--使用窗口函數(shù)計算銷售額排名

WITHsalesAS(

SELECT

'2023-01-01'ASdate,100ASamountUNIONALL

SELECT

'2023-01-02'ASdate,150ASamountUNIONALL

SELECT

'2023-01-03'ASdate,200ASamountUNIONALL

SELECT

'2023-01-04'ASdate,250ASamountUNIONALL

SELECT

'2023-01-05'ASdate,300ASamountUNIONALL

SELECT

'2023-01-06'ASdate,350ASamountUNIONALL

SELECT

'2023-01-07'ASdate,400ASamountUNIONALL

SELECT

'2023-01-08'ASdate,450ASamountUNIONALL

SELECT

'2023-01-09'ASdate,500ASamountUNIONALL

SELECT

'2023-01-10'ASdate,550ASamount

)

SELECT

date,

amount,

RANK()OVER(

ORDERBYamountDESC

)ASsales_rank

FROM

sales

ORDERBY

date;RANK()OVER函數(shù)根據(jù)amount列的值降序排列,為每個日期的銷售額分配一個排名。1.2高級JOIN操作與子查詢BigQuery支持多種JOIN操作,包括內(nèi)連接、左連接、右連接和全連接。子查詢則允許你在查詢中嵌套查詢,以執(zhí)行更復(fù)雜的操作。1.2.1JOIN操作示例:連接兩個表假設(shè)我們有兩個表,orders和customers,我們想要找出所有訂單及其對應(yīng)的客戶信息。--使用INNERJOIN連接兩個表

SELECT

orders.order_id,

orders.order_date,

customers.customer_name,

customers.customer_email

FROM

`project.dataset.orders`ASorders

INNERJOIN

`project.dataset.customers`AScustomers

ON

orders.customer_id=customers.customer_id;1.2.2子查詢示例:查詢特定條件的訂單如果我們只對2023年1月的訂單感興趣,可以使用子查詢來篩選orders表。--使用子查詢篩選特定時間的訂單

SELECT

orders.order_id,

orders.order_date,

customers.customer_name,

customers.customer_email

FROM

(

SELECT*

FROM`project.dataset.orders`

WHEREEXTRACT(YEARFROMorder_date)=2023

ANDEXTRACT(MONTHFROMorder_date)=1

)ASorders

INNERJOIN

`project.dataset.customers`AScustomers

ON

orders.customer_id=customers.customer_id;1.3數(shù)據(jù)分區(qū)和時間序列分析數(shù)據(jù)分區(qū)允許你根據(jù)特定列的值將數(shù)據(jù)分成不同的部分,這對于時間序列分析特別有用,可以按時間范圍對數(shù)據(jù)進(jìn)行分組和分析。1.3.1數(shù)據(jù)分區(qū)示例:按月分析銷售額如果我們想要按月分析sales表中的銷售額,可以使用PARTITIONBY。--使用PARTITIONBY按月分析銷售額

WITHsalesAS(

SELECT

'2023-01-01'ASdate,100ASamountUNIONALL

SELECT

'2023-01-02'ASdate,150ASamountUNIONALL

SELECT

'2023-01-03'ASdate,200ASamountUNIONALL

SELECT

'2023-02-01'ASdate,250ASamountUNIONALL

SELECT

'2023-02-02'ASdate,300ASamountUNIONALL

SELECT

'2023-02-03'ASdate,350ASamountUNIONALL

SELECT

'2023-03-01'ASdate,400ASamountUNIONALL

SELECT

'2023-03-02'ASdate,450ASamountUNIONALL

SELECT

'2023-03-03'ASdate,500ASamount

)

SELECT

EXTRACT(YEARFROMdate)ASyear,

EXTRACT(MONTHFROMdate)ASmonth,

SUM(amount)AStotal_sales

FROM

sales

GROUPBY

year,month

ORDERBY

year,month;在這個例子中,我們使用EXTRACT函數(shù)從date列中提取年份和月份,然后按這些值進(jìn)行分組,計算每個月的總銷售額。1.3.2時間序列分析示例:計算月銷售額增長率進(jìn)一步,我們想要計算每個月的銷售額增長率。--使用窗口函數(shù)計算月銷售額增長率

WITHsalesAS(

SELECT

'2023-01-01'ASdate,100ASamountUNIONALL

SELECT

'2023-01-02'ASdate,150ASamountUNIONALL

SELECT

'2023-01-03'ASdate,200ASamountUNIONALL

SELECT

'2023-02-01'ASdate,250ASamountUNIONALL

SELECT

'2023-02-02'ASdate,300ASamountUNIONALL

SELECT

'2023-02-03'ASdate,350ASamountUNIONALL

SELECT

'2023-03-01'ASdate,400ASamountUNIONALL

SELECT

'2023-03-02'ASdate,450ASamountUNIONALL

SELECT

'2023-03-03'ASdate,500ASamount

),

monthly_salesAS(

SELECT

EXTRACT(YEARFROMdate)ASyear,

EXTRACT(MONTHFROMdate)ASmonth,

SUM(amount)AStotal_sales

FROM

sales

GROUPBY

year,month

)

SELECT

year,

month,

total_sales,

(

total_sales-LAG(total_sales,1)OVER(

ORDERBYyear,month

)

)/LAG(total_sales,1)OVER(

ORDERBYyear,month

)*100ASsales_growth_rate

FROM

monthly_sales

ORDERBY

year,month;在這個例子中,我們首先計算每個月的總銷售額,然后使用LAG窗口函數(shù)來獲取前一個月的銷售額,從而計算出增長率。2優(yōu)化BigQuery性能2.1查詢優(yōu)化策略在BigQuery中,優(yōu)化查詢性能是至關(guān)重要的,因?yàn)樗苯佑绊懙讲樵兊膱?zhí)行速度和成本。以下是一些關(guān)鍵的查詢優(yōu)化策略:2.1.1使用分區(qū)表和截斷BigQuery支持分區(qū)表,這可以顯著減少掃描的數(shù)據(jù)量。例如,如果你有一個記錄每天用戶活動的表,你可以按日期分區(qū)它。這樣,當(dāng)你查詢特定日期范圍的數(shù)據(jù)時,BigQuery只會掃描相關(guān)的分區(qū),而不是整個表。示例代碼--創(chuàng)建一個按日期分區(qū)的表

CREATETABLEmydataset.mytable

PARTITIONBYDATE(_PARTITIONTIME)

AS

SELECT*FROMmydataset.oldtable;2.1.2選擇性使用JOINJOIN操作可以連接多個表,但在BigQuery中,它們可能會導(dǎo)致大量的數(shù)據(jù)掃描。為了優(yōu)化JOIN,確保JOIN的列是過濾條件的一部分,并且在可能的情況下使用內(nèi)連接(INNERJOIN)。示例代碼--優(yōu)化JOIN操作

SELECTt1.col1,t2.col2

FROMmydataset.table1t1

INNERJOINmydataset.table2t2

ONt1.id=t2.id

WHEREt1.dateBETWEEN'2023-01-01'AND'2023-01-31';2.1.3使用子查詢和WITH子句子查詢和WITH子句可以幫助你將復(fù)雜的查詢分解為更小、更易于管理的部分。這不僅可以提高可讀性,還可以優(yōu)化性能,因?yàn)锽igQuery可以更有效地處理這些小查詢。示例代碼--使用WITH子句優(yōu)化查詢

WITHfiltered_dataAS(

SELECT*FROMmydataset.mytable

WHEREdateBETWEEN'2023-01-01'AND'2023-01-31'

)

SELECT*FROMfiltered_data

WHEREcol1>100;2.2數(shù)據(jù)存儲與索引技術(shù)BigQuery使用列式存儲,這意味著它在物理上將數(shù)據(jù)的列分開存儲,而不是行。這種存儲方式非常適合于數(shù)據(jù)分析,因?yàn)樗梢钥焖俚刈x取和處理大量數(shù)據(jù)。2.2.1列式存儲的優(yōu)勢減少I/O操作:只讀取需要的列,而不是整個行,減少了I/O操作。壓縮效率:列式存儲可以更有效地壓縮數(shù)據(jù),因?yàn)橄嗤愋偷臄?shù)據(jù)通常具有更好的壓縮率。并行處理:BigQuery可以并行處理不同的列,加速查詢執(zhí)行。2.2.2索引的替代方案BigQuery不支持傳統(tǒng)意義上的索引,但通過以下方式可以達(dá)到類似的效果:分區(qū)表:按常用查詢條件分區(qū),減少掃描的數(shù)據(jù)量。聚簇列:在創(chuàng)建表時指定一個或多個列作為聚簇列,BigQuery會嘗試將這些列值相似的行物理上存儲在一起,從而提高查詢性能。示例代碼--創(chuàng)建一個聚簇列表

CREATETABLEmydataset.mytable

CLUSTERBYcol1

AS

SELECT*FROMmydataset.oldtable;2.3成本控制與預(yù)算管理BigQuery的查詢成本是基于數(shù)據(jù)掃描量的,因此,有效地管理成本是使用BigQuery的關(guān)鍵。2.3.1使用BigQuery沙盒BigQuery沙盒允許你設(shè)置查詢預(yù)算,防止意外的高成本查詢。你可以設(shè)置每日或每月的預(yù)算限制,一旦達(dá)到限制,BigQuery將停止執(zhí)行新的查詢。2.3.2優(yōu)化查詢以減少數(shù)據(jù)掃描使用WHERE子句過濾數(shù)據(jù):在查詢中使用WHERE子句可以減少掃描的數(shù)據(jù)量。避免使用SELECT*:只選擇你需要的列,避免掃描不必要的數(shù)據(jù)。示例代碼--優(yōu)化查詢以減少數(shù)據(jù)掃描

SELECTcol1,col2

FROMmydataset.mytable

WHEREdateBETWEEN'2023-01-01'AND'2023-01-31'

ANDcol1>100;2.3.3利用BigQuery的存儲成本優(yōu)化定期清理舊數(shù)據(jù):使用分區(qū)表和截斷功能,定期清理不再需要的數(shù)據(jù),以減少存儲成本。使用BigQuery的存儲分區(qū):將數(shù)據(jù)存儲在不同的分區(qū)中,可以更精細(xì)地控制成本。示例代碼--清理舊數(shù)據(jù)

DELETEFROMmydataset.mytable

WHERE_PARTITIONTIME<TIMESTAMP_SUB(CURRENT_TIMESTAMP(),INTERVAL1YEAR);通過遵循上述策略,你可以顯著提高BigQuery的查詢性能,同時有效地控制成本。3BigQuery與數(shù)據(jù)集成3.1連接外部數(shù)據(jù)源在BigQuery中,可以輕松地連接到外部數(shù)據(jù)源,如GoogleCloudStorage、GoogleDrive、以及各種云服務(wù)和本地數(shù)據(jù)庫。這使得數(shù)據(jù)集成變得簡單,允許用戶在BigQuery中直接查詢和分析這些數(shù)據(jù)源中的數(shù)據(jù),而無需將數(shù)據(jù)移動到BigQuery。3.1.1使用GoogleCloudStorageBigQuery可以直接讀取存儲在GoogleCloudStorage中的數(shù)據(jù)文件,支持CSV、JSON、Avro等多種格式。例如,假設(shè)你有一個CSV文件存儲在gs://my-bucket/data.csv,你可以使用以下SQL查詢來讀取數(shù)據(jù):--從GoogleCloudStorage中的CSV文件讀取數(shù)據(jù)

SELECT*FROM`my-project.my_dataset.my_table`

WHERE_FILE_NAME='gs://my-bucket/data.csv'這里,_FILE_NAME是一個特殊列,用于標(biāo)識數(shù)據(jù)的來源文件。在實(shí)際應(yīng)用中,你可能需要先創(chuàng)建一個外部數(shù)據(jù)表,指向存儲在GoogleCloudStorage中的文件,然后才能進(jìn)行查詢。3.1.2使用GoogleDrive雖然GoogleDrive不是直接支持的數(shù)據(jù)源,但你可以通過將Drive中的文件移動到GoogleCloudStorage,然后在BigQuery中創(chuàng)建外部數(shù)據(jù)表來訪問這些文件。3.1.3連接本地數(shù)據(jù)庫BigQuery本身不直接支持本地數(shù)據(jù)庫的連接,但你可以通過將數(shù)據(jù)導(dǎo)出到CSV文件,上傳到GoogleCloudStorage,然后在BigQuery中創(chuàng)建外部數(shù)據(jù)表來實(shí)現(xiàn)數(shù)據(jù)的集成。另一種方法是使用GoogleCloudDataflow或ApacheBeam等ETL工具,將數(shù)據(jù)從本地數(shù)據(jù)庫提取并加載到BigQuery。3.2使用BigQuery與GCP服務(wù)協(xié)同工作BigQuery可以與GoogleCloudPlatform(GCP)的其他服務(wù)無縫集成,如CloudPub/Sub、CloudFunctions、CloudDataflow等,以構(gòu)建復(fù)雜的數(shù)據(jù)處理和分析管道。3.2.1與CloudPub/Sub集成CloudPub/Sub是一個消息傳遞服務(wù),可以用于實(shí)時數(shù)據(jù)流的處理。你可以設(shè)置BigQuery作為CloudPub/Sub的訂閱者,每當(dāng)有新的消息發(fā)布時,BigQuery可以自動接收并存儲這些數(shù)據(jù)。例如,你可以創(chuàng)建一個觸發(fā)器,每當(dāng)有新的消息到達(dá)時,自動將數(shù)據(jù)加載到BigQuery表中。--創(chuàng)建一個表,用于接收CloudPub/Sub的數(shù)據(jù)

CREATETABLEmy_project.my_dataset.my_table(

message_idSTRING,

dataJSON,

publish_timeTIMESTAMP

);

--設(shè)置CloudPub/Sub觸發(fā)器

--這需要在GoogleCloudConsole中通過UI或使用gcloud命令行工具完成3.2.2與CloudFunctions集成CloudFunctions是一個無服務(wù)器計算平臺,可以用于執(zhí)行事件驅(qū)動的代碼。你可以創(chuàng)建一個CloudFunction,用于處理BigQuery中的數(shù)據(jù),例如,每當(dāng)BigQuery表中的數(shù)據(jù)發(fā)生變化時,CloudFunction可以自動運(yùn)行,執(zhí)行數(shù)據(jù)清洗、轉(zhuǎn)換等任務(wù)。defprocess_data(event,context):

"""TriggeredfromamessageonaCloudPub/Subtopic.

Args:

event(dict):Eventpayload.

context(google.cloud.functions.Context):Metadatafortheevent.

"""

importbase64

importjson

pubsub_message=base64.b64decode(event['data']).decode('utf-8')

data=json.loads(pubsub_message)

#這里可以添加你的數(shù)據(jù)處理邏輯

#例如,使用BigQueryPython客戶端庫執(zhí)行SQL查詢

fromgoogle.cloudimportbigquery

client=bigquery.Client()

query="""

INSERTINTO`my_project.my_dataset.my_table`

(column1,column2)

VALUES

('value1','value2')

"""

query_job=client.query(query)

query_job.result()3.2.3與CloudDataflow集成CloudDataflow是一個用于執(zhí)行數(shù)據(jù)處理管道的完全托管服務(wù)。你可以使用Dataflow來執(zhí)行ETL(提取、轉(zhuǎn)換、加載)任務(wù),將數(shù)據(jù)從各種來源提取,轉(zhuǎn)換為BigQuery所需的格式,然后加載到BigQuery中。importapache_beamasbeam

fromapache_beam.options.pipeline_optionsimportPipelineOptions

options=PipelineOptions()

withbeam.Pipeline(options=options)asp:

(p

|'ReadfromGCS'>>beam.io.ReadFromText('gs://my-bucket/data.csv',skip_header_lines=1)

|'ParseCSV'>>beam.Map(lambdaline:line.split(','))

|'WritetoBigQuery'>>beam.io.WriteToBigQuery(

'my_project:my_dataset.my_table',

schema='column1:STRING,column2:INTEGER',

write_disposition=beam.io.BigQueryDisposition.WRITE_APPEND,

create_disposition=beam.io.BigQueryDisposition.CREATE_IF_NEEDED

)

)3.3數(shù)據(jù)同步與ETL流程數(shù)據(jù)同步和ETL流程是數(shù)據(jù)集成的關(guān)鍵部分,用于確保數(shù)據(jù)的準(zhǔn)確性和一致性。3.3.1數(shù)據(jù)同步數(shù)據(jù)同步可以確保BigQuery中的數(shù)據(jù)與外部數(shù)據(jù)源保持一致。你可以使用CloudDataflow或CloudDataprep等工具來定期或?qū)崟r地同步數(shù)據(jù)。3.3.2ETL流程ETL(提取、轉(zhuǎn)換、加載)流程用于從各種數(shù)據(jù)源提取數(shù)據(jù),轉(zhuǎn)換數(shù)據(jù)格式和內(nèi)容,然后加載到BigQuery中。在BigQuery中,你可以使用SQL查詢來執(zhí)行數(shù)據(jù)轉(zhuǎn)換,例如,使用SELECT語句來過濾和轉(zhuǎn)換數(shù)據(jù),然后使用INSERTINTO或CREATETABLEAS語句將數(shù)據(jù)加載到BigQuery表中。--從一個表中提取數(shù)據(jù),轉(zhuǎn)換數(shù)據(jù)格式,然后加載到另一個表中

CREATETABLEmy_project.my_dataset.new_tableAS

SELECT

DATE(TIMESTAMP_MILLIS(timestamp_column))ASdate,

SUM(value_column)AStotal_value

FROM

my_project.my_dataset.old_table

GROUPBY

date在這個例子中,我們從old_table中提取數(shù)據(jù),將timestamp_column轉(zhuǎn)換為日期格式,然后將value_column的總和計算為total_value,最后將轉(zhuǎn)換后的數(shù)據(jù)加載到new_table中。4高級數(shù)據(jù)建模與分析4.1構(gòu)建復(fù)雜的數(shù)據(jù)模型在構(gòu)建復(fù)雜數(shù)據(jù)模型時,BigQuery提供了多種高級SQL功能,如窗口函數(shù)、子查詢、聯(lián)合查詢等,這些功能可以幫助我們更深入地分析數(shù)據(jù),發(fā)現(xiàn)隱藏的模式和趨勢。4.1.1窗口函數(shù)示例假設(shè)我們有一個銷售數(shù)據(jù)表sales,包含product_id、sale_date和quantity字段。我們想要計算每個產(chǎn)品的滾動平均銷售量。--使用窗口函數(shù)計算每個產(chǎn)品的滾動平均銷售量

SELECT

product_id,

sale_date,

quantity,

AVG(quantity)OVER(

PARTITIONBYproduct_id

ORDERBYsale_date

ROWSBETWEEN3PRECEDINGANDCURRENTROW

)ASrolling_avg

FROM

sales

ORDERBY

product_id,

sale_date;4.1.2子查詢與聯(lián)合查詢示例如果我們需要從sales表中找出銷售量最高的前10個產(chǎn)品,并且這些產(chǎn)品在inventory表中的庫存量也超過100,我們可以使用子查詢和聯(lián)合查詢。--使用子查詢和聯(lián)合查詢找出銷售量最高的前10個產(chǎn)品,且?guī)齑媪砍^100

WITHtop_salesAS(

SELECT

product_id,

SUM(quantity)AStotal_sales

FROM

sales

GROUPBY

product_id

ORDERBY

total_salesDESC

LIMIT10

)

SELECT

duct_id,

ts.total_sales,

i.quantityASinventory

FROM

top_salests

JOIN

inventoryiONduct_id=duct_id

WHERE

i.quantity>100;4.2使用BigQuery進(jìn)行預(yù)測分析BigQuery支持機(jī)器學(xué)習(xí)(ML)功能,允許直接在BigQuery中構(gòu)建和部署ML模型,無需將數(shù)據(jù)移動到其他環(huán)境。這包括使用ML.PREDICT函數(shù)進(jìn)行預(yù)測。4.2.1ML.PREDICT示例假設(shè)我們有一個用戶行為數(shù)據(jù)表user_activity,其中包含用戶特征和是否購買的標(biāo)簽。我們使用邏輯回歸模型進(jìn)行預(yù)測。--創(chuàng)建邏輯回歸模型

CREATEORREPLACEMODELmymodel.logistic_regression

OPTIONS(model_type='logistic_reg')AS

SELECT

IF(totals.transactionsISNULL,0,1)ASlabel,

IFNULL(device.operatingSystem,"")ASos,

IFNULL(geoNetwork.country,"")AScountry,

IFNULL(totals.pageviews,0)ASpageviews

FROM

`bigquery-public-data.google_analytics_sample.ga_sessions_*`

WHERE

_TABLE_SUFFIXBETWEEN'20160801'AND'20170630';

--使用模型進(jìn)行預(yù)測

SELECT

os,

country,

pageviews,

ML.PREDICT(STRUCT(labelASlabel),mymodel.logistic_regression)ASprediction

FROM

`bigquery-public-data.google_analytics_sample.ga_sessions_*`

WHERE

_TABLE_SUFFIXBETWEEN'20170701'AND'20170801';4.3數(shù)據(jù)可視化與儀表板創(chuàng)建雖然BigQuery本身不提供數(shù)據(jù)可視化功能,但可以與GoogleDataStudio集成,創(chuàng)建動態(tài)儀表板和報告。4.3.1創(chuàng)建儀表板示例從BigQuery導(dǎo)入數(shù)據(jù):在DataStudio中,選擇“數(shù)據(jù)源”>“連接到數(shù)據(jù)”,然后選擇BigQuery數(shù)據(jù)源。創(chuàng)建報告:選擇“創(chuàng)建報告”,然后從BigQuery數(shù)據(jù)源中選擇數(shù)據(jù)集和表。添加圖表:從左側(cè)的“圖表”面板中選擇圖表類型,如條形圖、折線圖或餅圖,然后將數(shù)據(jù)字段拖放到圖表中。自定義圖表:使用右側(cè)的“樣式”面板調(diào)整圖表的外觀和行為。分享儀表板:完成后,可以分享儀表板鏈接,或?qū)⑵淝度氲骄W(wǎng)站或應(yīng)用中。例如,使用條形圖顯示sales表中每個產(chǎn)品的銷售量:選擇數(shù)據(jù)源:BigQuery。選擇數(shù)據(jù)集和表:sales。添加條形圖:將product_id拖到X軸,將quantity拖到Y(jié)軸。自定義圖表:設(shè)置標(biāo)題、顏色和標(biāo)簽。分享:生成鏈接或嵌入代碼。通過這些高級應(yīng)用,BigQuery不僅是一個強(qiáng)大的數(shù)據(jù)倉庫,也是一個全面的數(shù)據(jù)分析和預(yù)測平臺,能夠滿足復(fù)雜的數(shù)據(jù)處理需求。5BigQuery:BigQuerySQL語言高級應(yīng)用-安全與訪問控制5.1設(shè)置細(xì)粒度訪問控制細(xì)粒度訪問控制(Fine-grainedAccessControl,FGAC)是BigQuery中一項(xiàng)關(guān)鍵的安全特性,允許數(shù)據(jù)所有者或管理員對數(shù)據(jù)訪問進(jìn)行更精確的控制。不同于傳統(tǒng)的基于角色的訪問控制(RBAC),F(xiàn)GAC允許對數(shù)據(jù)行或列級別的訪問進(jìn)行控制,這對于處理敏感數(shù)據(jù)或需要遵守嚴(yán)格數(shù)據(jù)訪問政策的場景尤為重要。5.1.1原理FGAC在BigQuery中通過使用SECURITYDEFINER和ROWLEVELSECURITY(RLS)策略實(shí)現(xiàn)。SECURITYDEFINER允許函數(shù)或存儲過程在調(diào)用者的權(quán)限之外執(zhí)行操作,而RLS則允許根據(jù)用戶屬性或條件來限制數(shù)據(jù)行的可見性。5.1.2內(nèi)容定義安全函數(shù):使用SECURITYDEFINER創(chuàng)建函數(shù),該函數(shù)可以訪問超出調(diào)用者權(quán)限的數(shù)據(jù)。創(chuàng)建RLS策略:定義基于用戶屬性或條件的行級安全策略,以控制數(shù)據(jù)行的可見性。應(yīng)用策略:將RLS策略應(yīng)用到表上,確保只有滿足策略條件的用戶才能看到特定的行。5.1.3示例假設(shè)我們有一個包含用戶健康數(shù)據(jù)的表health_data,其中包含user_id和health_status字段。我們希望只有特定的醫(yī)生才能訪問其患者的健康數(shù)據(jù)。創(chuàng)建安全函數(shù)--創(chuàng)建一個安全函數(shù),用于檢查用戶是否是特定醫(yī)生

CREATEFUNCTIONIFNOTEXISTS`my_project.my_dataset.is_doctor_for_user`(user_idINT64,doctor_idINT64)

RETURNSBOOL

LANGUAGEjs

SECURITYDEFINER

OPTIONS(library=['gs://my-bucket/doctors.js'])

AS"""

//從GoogleCloudStorage中加載醫(yī)生-患者映射數(shù)據(jù)

constdoctors=JSON.parse(awaitstorage.bucket('my-bucket').file('doctors.json').download());

returndoctors[doctor_id]&&doctors[doctor_id].includes(user_id);

""";創(chuàng)建RLS策略--創(chuàng)建一個RLS策略,基于安全函數(shù)限制數(shù)據(jù)訪問

CREATEPOLICYIFNOTEXISTS`my_project.my_dataset.health_data_policy`

AS(

--只有當(dāng)調(diào)用者是患者對應(yīng)的醫(yī)生時,才允許訪問

IF`my_project.my_dataset.is_doctor_for_user`(health_data.user_id,CURRENT_USER().user_id)THENTRUEELSEFALSE

);應(yīng)用策略--將RLS策略應(yīng)用到表上

ALTERTABLE`my_project.my_dataset.health_data`

SETOPTIONS(

policy_tags=['my_project.my_dataset.health_data_policy']

);通過以上步驟,我們確保了只有當(dāng)用戶(醫(yī)生)通過安全函數(shù)檢查時,才能訪問health_data表中的數(shù)據(jù)。5.2數(shù)據(jù)加密與安全策略數(shù)據(jù)加密是保護(hù)數(shù)據(jù)免受未授權(quán)訪問和使用的重要手段。BigQuery提供了多種數(shù)據(jù)加密選項(xiàng),包括客戶管理的加密密鑰(Customer-ManagedEncryptionKeys,CMEK)和BigQuery托管的加密密鑰(BigQuery-ManagedEncryptionKeys,BQMEK)。5.2.1原理CMEK:允許用戶使用自己的密鑰來加密數(shù)據(jù),這些密鑰存儲在GoogleCloudKeyManagement

溫馨提示

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

最新文檔

評論

0/150

提交評論