目前我使用 Parquet 文件将数据导入 BigQuery (GIS)。其中一个 Parquet 文件包含几何列,将几何数据表示为 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。是否可以选择以某种方式强制将 Parquet 的包含 WKT 字符串的列转换为 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()
最佳答案
这在 GIS 测试版期间尚不可能。它将在 BigQuery GIS 正式发布之前可用,但目前您无法使用 Parquet 直接加载。在 Beta 期间,您可以使用 CSV、换行符分隔的 JSON 或流式加载 API 直接加载到地理列。
更新(2018 年 10 月 30 日):现在应该可以了。您可以将 GEOGRAPHY 指定为列类型,或加载到具有 GEOGRAPHY 列的现有表中。来自 Parquet/Avro 的字符串列将被解析并转换为 GEOGRAPHY。
关于google-cloud-platform - 使用 Avro/Parquet 将地理数据导入 BigQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52380937/