如何从 geoJSON 文件中分离具有 NULL 值的记录?

Posted

技术标签:

【中文标题】如何从 geoJSON 文件中分离具有 NULL 值的记录?【英文标题】:How to separate records with NULL values from a geoJSON file? 【发布时间】:2020-04-29 11:02:51 【问题描述】:

我有一个 geoJSON 文件如下 -

"EFTA_FLAG": "F", "OTHR_FLAG": "F", "EU_FLAG": "T", "COAS_FLAG": "F", "NUTS_BN_ID": 108, "CC_FLAG": "F", "LEVL_CODE": 3, "FID": 108, "geometry": "\"type\": \"LineString\", \"coordinates\": [[24.28752, 35.17601], [24.28513, 35.19078], [24.29281, 35.20274], [24.2949, 35.21629], [24.30594, 35.23965], [24.28578, 35.23943], [24.27087, 35.24888], [24.27403, 35.25674], [24.28072, 35.26354], [24.29232, 35.27115], [24.30861, 35.27614], [24.31421, 35.28196], [24.32534, 35.28467], [24.33098, 35.29074], [24.3305, 35.31241], [24.32346, 35.32514], [24.31741, 35.35377]]"
"EFTA_FLAG": "F", "OTHR_FLAG": "F", "EU_FLAG": "T", "COAS_FLAG": "F", "NUTS_BN_ID": 298, "CC_FLAG": "F", "LEVL_CODE": 3, "FID": 298, "geometry": "\"type\": \"LineString\", \"coordinates\": [[-6.34556, 36.79877], [-6.34397, 36.79998], [-6.34244, 36.80314], [-6.34244, 36.8053], [-6.3436, 36.81252], [-6.34495, 36.81596], [-6.35188, 36.8253], [-6.35296, 36.82927], [-6.35331, 36.83487], [-6.35398, 36.83836], [-6.35362, 36.85142], [-6.35296, 36.85741], [-6.34889, 36.87373], [-6.34594, 36.88804], [-6.34333, 36.89191], [-6.33989, 36.89527], [-6.33823, 36.89626], [-6.33107, 36.89884]]"
"EFTA_FLAG": "F", "OTHR_FLAG": "F", "EU_FLAG": "T", "COAS_FLAG": "F", "NUTS_BN_ID": 355, "CC_FLAG": "F", "LEVL_CODE": 3, "FID": 355, "geometry": "null"

使用以下语法将其加载到 BigQuery 中 -

bq load --source_format NEWLINE_DELIMITED_JSON dataset.table_name data.json geometry:GEOGRAPHY,EU_FLAG,CC_FLAG,OTHR_CNTR_FLAG,LEVL_CODE:int64,FID:int64,EFTA_FLAG,COAS_FLAG,NUTS_BN_ID:int64

它会抛出错误 -

失败详情: - 读取数据时出错,错误信息:JSON 处理遇到太多错误,放弃。行数:467;错误:1;最大坏:0;错误 百分比:0 - 查询:无法将 JSON 值转换为地理:位置 0 处出现意外的“空”。字段:几何;值:空

我也需要在几何中加载 NULL 的记录。如何分隔 NULL 和非 NULL 记录?那么如何在 BQ 表中也加载 NULL 记录呢?

【问题讨论】:

您可以尝试使用空标记 ==> --null_marker=null 嗨,Cavin,试过了,但还是不行。它仅适用于 CSV 文件。 你能用这个创建一个模式文件吗: ["name": "geometry", "type": "geography", "mode":"NULLABLE" , "name": " EU_FLAG”,“类型”:“字符串”,“模式”:“NULLABLE”,“名称”:“CC_FLAG”,“类型”:“字符串”,“模式”:“NULLABLE”,“名称” :“OTHR_CNTR_FLAG”,“类型”:“字符串”,“模式”:“NULLABLE”,“名称”:“LEVL_CODE”,“类型”:“int64”,“模式”:“NULLABLE”,“名称”:“FID”,“类型”:“int64”,“模式”:“NULLABLE”,“名称”:“EFTA_FLAG”,“类型”:“字符串”,“模式”:“NULLABLE”, “名称”:“COAS_FLAG”,“类型”:“字符串”,“模式”:“NULLABLE”,“名称”:“NUTS_BN_ID”,“类型”:“int64”,“模式”:“NULLABLE” ] 然后运行 ​​bq load --source_format NEWLINE_DELIMITED_JSON dataset.table_name data.json 你试过了吗? 【参考方案1】:

在 JSON 中,NULL 值应该不带引号进行编码,只需 "geometry": null

对于这个 JSON 文件,我会将其加载到一个临时表中,使用 STRING 类型作为几何字段。然后使用类似的查询将其转换为GEOMETRY 类型

CREATE TABLE final_table AS
SELECT 
  * EXCEPT(geometry), 
  IF(geometry <> 'null', ST_GeogFromGeoJson(geometry), NULL) AS geometry
FROM temp_table 

【讨论】:

以上是关于如何从 geoJSON 文件中分离具有 NULL 值的记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不删除任何文件的情况下从跟踪中分离文件夹?

如何从模板组件中分离模板(延迟加载模板)

在 MySQL PHP 中从多行结果中分离行

JAVA从url中分离ip和port

如何从字符串中分离许多不同的单词(Java)

linux下如何从FIT镜像(*.itb)中分离出内核根文件系统和设备树?