pyspark 从GCP BigQuery导出到parquet:如何获得适当的比例,数值类型的精度?

up9lanfz  于 2024-01-06  发布在  Spark
关注(0)|答案(1)|浏览(163)

我在BQ中的tableA中有一个类型为NUMERIC(29)的列A。我使用BigQueryToGCSOperator将其导出到parquet:

  1. transferBigQuerryToBucket = BigQueryToGCSOperator(
  2. task_id='BigQuerryToBucket'
  3. ,source_project_dataset_table= xyz
  4. ,compression="GZIP"
  5. ,destination_cloud_storage_uris=xyz
  6. ,location=xyz
  7. ,export_format="Parquet"
  8. ,force_rerun=True)

字符串
然后用pyspark读出来
我遇到了一个问题,因为Spark看到表作为
第一个月
我认为这可能是气流操作器或Spark的问题,所以我直接从BQ导出数据:

  1. EXPORT DATA OPTIONS(
  2. format='PARQUET',
  3. uri='gs://address',
  4. overwrite=true
  5. )
  6. AS
  7. SELECT columnA
  8. FROM tableA


用python,pyarrow读出来,所以这里没有气流,没有Spark。我得到:
optional fixed_len_byte_array(16) field_id=-1 columnA (Decimal(precision=38, scale=9));
这会导致一个问题,因为我在spark的数组中接收到像213123123132.00000000这样的数字,结果我在csv中得到了这些零。
我认为有两种可能的解决办法:
1.为表提供一个单独的模式--但这会给我的工作流增加很多工作,我希望避免这样做,因为parquet应该在元数据中保存模式。
1.某种Spark函数/UDF,将删除这些0(我需要一个通用的解决方案,虽然,不特定于表A),但我看到这里有很多问题-什么是条件,即修改哪些记录,使用哪个函数等。更不用说这种方法的效率。
这些解决方案都没有直接解决问题-元数据中的错误信息(或者可能是python/pyspark在阅读此元数据时的问题)。
我很感激任何建议谢谢

6psbrbz9

6psbrbz91#

不幸的是,这是查询中参数化类型的限制。从文档中:
第一个月
在这种情况下,如果你想在Spark中保留类型,你可以尝试使用BigQuerySparkConnector直接传输数据,这会努力保留参数化。我不太了解气流,不知道如何在那个环境中设置它。

相关问题