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

时间:2018-09-18 07:16:44

标签: google-cloud-platform google-bigquery gis avro parquet

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

Q1。文档中提到不支持从WKT(字符串)到GEOGRAPHY的自动转换,那么如何解决此问题? 我想避免使用CSV文件,而手动提供架构定义。

但是,即使我首先创建了一个空表,并且只想添加新的Parquet文件,它也无法正常工作: Provided Schema does not match Table <org>-internal:test.<table>. Field geom has changed type from GEOGRAPHY to STRING.。 (与Avro相同)

Q2。是否可以选择以某种方式 force 将持有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 个答案:

答案 0 :(得分:1)

这在GIS beta版中尚不可能。 BigQuery GIS正式发布之前,它将可用,但是目前您无法使用Parquet直接加载。在Beta中,您可以使用CSV,换行符分隔的JSON或流加载API直接加载到“地理位置”列。

更新(2018年10月30日):现在应该可以使用。您可以将GEOGRAPHY指定为列类型,也可以使用GEOGRAPHY列将其加载到现有表中。 Parquet / Avro中的字符串列将被解析并转换为GEOGRAPHY。