這沒有答案,我有一個類似的問題,但我會擴展它。
假設我有 3 個 CSV 檔案s3://test_path/。我想創建一個外部表并用這些 CSV 中的資料填充它。但是,不僅 CSV 中的列順序不同,而且某些 CSV 中可能缺少某些列。
Redshift Spectrum 能做我想做的事嗎?
a.csv:
id,name,type
a1,apple,1
a2,banana,2
b.csv:
type,id,name
1,b1,orange
2,b2,lemon
c.csv:
name,id
kiwi,c1
我通過在 Redshift 集群上的 Redshift 查詢編輯器 v2 中運行它來創建外部資料庫/模式和表:
CREATE EXTERNAL SCHEMA test_schema
FROM DATA CATALOG
DATABASE 'test_db'
REGION 'region'
IAM_ROLE 'iam_role'
CREATE EXTERNAL DATABASE IF NOT EXISTS
;
CREATE EXTERNAL TABLE test_schema.test_table (
"id" VARCHAR,
"name" VARCHAR,
"type" SMALLINT
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
STORED AS TEXTFILE
LOCATION 's3://test_path/'
TABLE PROPERTIES ('skip.header.line.count'='1')
;
我希望SELECT * FROM test_schema.test_table產生:
| ID | 名稱 | 型別 |
|---|---|---|
| a1 | 蘋果 | 1 |
| a2 | 香蕉 | 2 |
| b1 | 橘子 | 1 |
| b2 | 檸檬 | 2 |
| c1 | 獼猴桃 | 空值 |
相反,我得到:
| ID | 名稱 | 型別 |
|---|---|---|
| a1 | 蘋果 | 1 |
| a2 | 香蕉 | 2 |
| 1 | b1 | 空值 |
| 2 | b2 | 空值 |
| 獼猴桃 | c1 | 空值 |
似乎 Redshift Spectrum 無法在檔案中按名稱匹配列,就像pandas.concat()使用具有不同列順序的資料框一樣。
uj5u.com熱心網友回復:
不,您的資料需要轉換以對齊檔案之間的資料。您的 Spectrum DDL 指定忽略 CSV 的第一行,因此您需要的資訊甚至不會被讀取。
如果您想讓這些檔案可用作一個 Spectrum 表,您需要將它們轉換為對齊列并將新檔案存盤到 S3。如果您還有一段支持代碼從每個檔案讀取列順序,則可以使用 Redshift 執行此操作。您可以撰寫一個 Lambda 來輕松完成此操作,或者如果您的 CSV 檔案相當簡單,那么 Glue 爬蟲就可以作業。幾乎任何 ETL 工具都可以做到這一點。有很多選擇,但這些檔案并未按原樣準備好 Spectrum。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/417032.html
標籤:
上一篇:完全洗掉與Python相同的值
