无法为 Parquet 类型为可选二进制的数据类型“timestamp”创建 Parquet 转换器

问题描述 投票:0回答:1

尝试使用 PySpark 数据帧读取镶木地板文件并将其写回 bigquery 时,出现以下错误。

Caused by: org.apache.spark.SparkRuntimeException: Unable to create Parquet converter for data type "timestamp" whose Parquet type is optional binary

读取 ADLS parquet 文件后显示的数据框架构如下:

------------------------
|-- event_timestamp_local: timestamp (nullable = true)
|-- event_timestamp_eu: timestamp (nullable = true)
|-- event_timestamp_us: timestamp (nullable = true)
|-- event_timestamp_asia: timestamp (nullable = true)
|-- event_timestamp_africa: timestamp (nullable = true)
------------------------

目标 BQ 模式是在读取上述模式后由 Spark 会话自动创建的,问题从那里开始发生。

我检查了镶木地板架构,发现有一个“时间戳”字段。有什么方法可以修复此错误,同时在目标中保持相同的数据类型,例如:bq。

pyspark google-bigquery azure-databricks
1个回答
0
投票

使用配置

.config("spark.sql.parquet.timestampNTZ.enabled", "true")
会对您有所帮助。

from pyspark.sql import SparkSession
spark = SparkSession.builder \
    .config("spark.sql.parquet.timestampNTZ.enabled", "true") \
    .getOrCreate()

因为在 Spark 中,

timestampNTZ
类型指的是“没有时区的时间戳”,这会导致错误:

原因:org.apache.spark.SparkRuntimeException:无法为 Parquet 类型为可选二进制的数据类型“timestamp”创建 Parquet 转换器

在读取或写入 Parquet 文件时,由于系统之间处理时间戳的方式不同。

启用此配置后,Spark 将以某种方式处理时间戳字段,以避免 Parquet 格式存储时间戳的方式与需要在 PySpark 中读取或写入时间戳的方式之间出现差异。

这可以防止由于 Parquet 与 BigQuery 解释和存储时间戳数据类型的方式不匹配而发生的错误。

参考:Spark忽略参数spark.sql.parquet.writeLegacyFormat

© www.soinside.com 2019 - 2024. All rights reserved.