[英]how to upload a parquet file into Azure ADLS 2 Blob
嗨,我想將 Parquet 文件上傳到 ADLS gen 2 blob。 我正在使用下面的代碼行來創建 blob 並在其中上傳 parquet 文件。
blob = BlobClient.from_connection_string(conn_str="Connection String", container_name="parquet", blob_name=outdir)
df.to_parquet('logs.parquet',compression='GZIP') #df is dataframe
with open("./logs.parquet", "rb") as data:
blob.upload_blob(data)
os.remove("logs.parquet")
我沒有遇到任何錯誤,文件也寫在 blob 中。 但是,我不認為我做對了,因為 ADX/kusto 查詢無法理解該文件並且那里沒有數據可見。
以下是我在 Azure 數據資源管理器中執行的步驟,以從 ADLS gen 2 中上傳的 parquet 文件中獲取記錄。
創建的外部表:
.create external table LogDataParquet(AppId_s:string,UserId_g:string,Email_s:string,RoleName_s:string,Operation_s:string,EntityId_s:string,EntityType_s:string,EntityName_s:string,TargetTitle_s:string,TimeGenerated:datetime)
kind=blob
dataformat=parquet
(
h@'https://streamoutalds2.blob.core.windows.net/stream-api-raw-testing;secret'
)
with
(
folder = "ExternalTables"
)
外部表列映射:
.create external table LogDataParquet parquet mapping "LogDataMapparquet" '[{ "column" : "AppId_s", "path" : "$.AppId_s"},{ "column" : "UserId_g", "path" : "$"},{ "column" : "Email_s", "path" : "$.Email_s"},{ "column" : "RoleName_s", "path" : "$.RoleName_s"},{ "column" : "Operation_s", "path" : "$.Operation_s"},{ "column" : "EntityId_s", "path" : "$.EntityId_s"}]'
外部表不提供記錄
external_table('LogDataParquet')
沒有記錄
external_table('LogDataParquet') | count
1 條記錄 - 計數 0
我使用 stream 分析使用了類似的場景,我接收傳入的流並將其以鑲木地板格式保存到 ADLS。 在這種情況下,ADX 中的外部表可以很好地獲取記錄。 我覺得我在用 blob 編寫鑲木地板文件的方式上犯了錯誤 - (使用 open("./logs.parquet", "rb") 作為數據:)
根據日志,外部表定義如下:
.create external table LogDataParquet(AppId_s:string,UserId_g:string,Email_s:string,RoleName_s:string,Operation_s:string,EntityId_s:string,EntityType_s:string,EntityName_s:string,TargetTitle_s:string,TimeGenerated:datetime)
kind=blob
partition by
AppId_s,
bin(TimeGenerated,1d)
dataformat=parquet
(
'******'
)
with
(
folder = "ExternalTables"
)
PARTITION BY
子句告訴 ADX 預期的文件夾布局是:
<AppId_s>/<TimeGenerated, formatted as 'yyyy/MM/dd'>
例如:
https://streamoutalds2.blob.core.windows.net/stream-api-raw-testing;secret/SuperApp/2020/01/31
您可以在本節中找到有關 ADX 如何在查詢期間在外部存儲上定位文件的更多信息: https://docs.microsoft.com/en-us/azure/data-explorer/kusto/management/external-tables-azurestorage -azuredatalake#artifact-filtering-logic
要根據文件夾布局修復外部表定義,請使用.alter
命令:
.alter external table LogDataParquet(AppId_s:string,UserId_g:string,Email_s:string,RoleName_s:string,Operation_s:string,EntityId_s:string,EntityType_s:string,EntityName_s:string,TargetTitle_s:string,TimeGenerated:datetime)
kind=blob
dataformat=parquet
(
h@'https://streamoutalds2.blob.core.windows.net/stream-api-raw-testing;secret'
)
with
(
folder = "ExternalTables"
)
順便說一句,如果映射是幼稚的(例如,映射的列名與數據源列名匹配),那么 Parquet 格式就不需要它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.