[英]Bigquery parquet file treats list<string> as list<int32> when empty array is passed
[英]Spark writing Parquet array<string> converts to a different datatype when loading into BigQuery
火花 Dataframe 架構:
StructType(
[StructField("a", StringType(), False),
StructField("b", StringType(), True),
StructField("c" , BinaryType(), False),
StructField("d", ArrayType(StringType(), False), True),
StructField("e", TimestampType(), True)
])
當我將數據框寫入 parquet 並將其加載到 BigQuery 中時,它以不同的方式解釋架構。 它是從 JSON 簡單加載並使用 spark dataframe 寫入 parquet。
大查詢模式:
[
{
"type": "STRING",
"name": "a",
"mode": "REQUIRED"
},
{
"type": "STRING",
"name": "b",
"mode": "NULLABLE"
},
{
"type": "BYTES",
"name": "c",
"mode": "REQUIRED"
},
{
"fields": [
{
"fields": [
{
"type": "STRING",
"name": "element",
"mode": "NULLABLE"
}
],
"type": "RECORD",
"name": "list",
"mode": "REPEATED"
}
],
"type": "RECORD",
"name": "d",
"mode": "NULLABLE"
},
{
"type": "TIMESTAMP",
"name": "e",
"mode": "NULLABLE"
}
]
這與 spark 的寫入方式有關,還是與 BigQuery 讀取鑲木地板的方式有關。 知道我該如何解決這個問題嗎?
這是由於spark-bigquery 連接器使用的中間文件格式(默認為 parquet)。
連接器首先將數據寫入 parquet 文件,然后使用 BigQuery Insert API 將它們加載到 BigQuery。
如果您使用parquet-tools
檢查中間鑲木地板模式,您會發現類似這樣的字段d
(Spark 中的 ArrayType(StringType))
optional group a (LIST) {
repeated group list {
optional binary element (STRING);
}
}
現在,如果您使用bq load
或 BigQuery Insert API 直接在 BigQuery 中自己加載此鑲木地板,您可以通過啟用parquet_enable_list_inference
告訴 BQ 忽略中間字段
不幸的是,在使用 spark-bigquery 連接器時,我看不到如何啟用此選項!
作為解決方法,您可以嘗試使用orc
作為中間格式。
df
.write
.format("bigquery")
.option("intermediateFormat", "orc")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.