簡體   English   中英

Spark 寫 Parquet 數組<string>加載到 BigQuery 時轉換為不同的數據類型</string>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM