尝试使用 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。
使用配置
.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 解释和存储时间戳数据类型的方式不匹配而发生的错误。