我在 BQ 的表 A 中有一个类型为 NUMERIC(29) 的列 A。我使用 BigQueryToGCSOperator 将其导出到镶木地板:
transferBigQuerryToBucket = BigQueryToGCSOperator(
task_id='BigQuerryToBucket'
,source_project_dataset_table= xyz
,compression="GZIP"
,destination_cloud_storage_uris=xyz
,location=xyz
,export_format="Parquet"
,force_rerun=True)
并用 pyspark 读入它。
我遇到了一个问题,因为 Spark 将该表视为
StructType([StructField('columnA', DecimalType(38,9), True])
我认为可能是气流算子或者spark的问题,所以我直接从BQ导出数据:
EXPORT DATA OPTIONS(
format='PARQUET',
uri='gs://address',
overwrite=true
)
AS
SELECT columnA
FROM tableA
,然后用 python、pyarrow 读入它 - 所以这里没有气流,没有火花。我得到了:
optional fixed_len_byte_array(16) field_id=-1 columnA (Decimal(precision=38, scale=9));
这会导致问题,因为我在 Spark 数据框中收到类似 213123123132.00000000 的数字,结果我在 csv 中得到这些零。
我看到两种可能的解决方案:
这些解决方案都没有直接解决问题 - 元数据中的信息错误(或者可能是 python/pyspark 读取此元数据时出现问题)。
如有任何建议,我将不胜感激。谢谢你
不幸的是,这是查询中参数化类型的限制。来自文档:
A data type's parameters are not propagated in an expression, only the data type is.
BigQuerySparkConnector 直接传输数据,这有助于保留参数化。我对气流了解不够,不知道如何在该环境中进行设置。