使用Avro/Parquet将地理数据导入BigQuery

3

目前我使用 Parquet 文件将数据导入到 BigQuery(GIS)中。其中一个 Parquet 文件包含几何列,将几何数据表示为 WKT 字符串(MultiPolygon),我想将该列作为 GEOGRAPHY 类型导入。

Q1. 文档提到不支持从 WKT(字符串)自动转换为 GEOGRAPHY,那么我该如何解决这个问题? 我想避免使用 CSV 文件,并手动提供模式定义。

但是,即使我先创建空表,只想附加新的 Parquet 文件,它也无法工作:提供的模式与表 <org>-internal:test.<table> 不匹配。字段 geom 的类型已从 GEOGRAPHY 更改为 STRING。。(Avro 也是一样)

Q2. 是否有选项以某种方式强制将包含 WKT 字符串的 Parquet 列转换为 GEOGRAPHY 类型? 我不想先加载临时表,然后运行查询以执行所有转换以加载目标表。

更新: 使用 python 客户端时,我能够手动为要导入的 Parquet 文件指定架构。加载完成后,GEOGRAPHY 列中的所有值都具有值INVALID。 CSV 的相同代码正常工作。

from google.cloud import bigquery

client = bigquery.Client(project='<project>')

table_ref = client.dataset('test').table('geometry')

job_config = bigquery.LoadJobConfig()
job_config.write_disposition = bigquery.WriteDisposition.WRITE_TRUNCATE
job_config.schema = [
    bigquery.SchemaField('id', 'INTEGER'),
    bigquery.SchemaField('geom', 'GEOGRAPHY'),
]

# CSV works fine!
# uri = 'gs://<bucket>/multipoly_sample.csv'
# job_config.source_format = bigquery.SourceFormat.CSV

# With Parquet, values in geom column are all "INVALID" 
uri = 'gs://<bucket>/multipoly_sample.parquet'
job_config.source_format = bigquery.SourceFormat.PARQUET

load_job = client.load_table_from_uri(
    uri,
    table_ref,
    job_config=job_config)
load_job.result()
1个回答

1
在GIS测试版期间,这还不可能。在BigQuery GIS正式发布之前,它将可用,但现在您无法直接使用Parquet进行加载。在Beta期间,您可以使用CSV、newline-delimited-JSON或流式加载API直接加载到地理列中。
更新(2018年10月30日):现在应该可以了。您可以将GEOGRAPHY指定为列类型,或者将其加载到具有GEOGRAPHY列的现有表中。来自Parquet/Avro的字符串列将被解析并转换为GEOGRAPHY。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接